JavaScript try…catch…finally

概要: このチュートリアルでは、JavaScriptのtry...catch...finally文を使用して例外をキャッチし、例外が発生するかどうかにかかわらずブロックを実行する方法を学習します。

JavaScript try…catch…finally文入門

try...catch文を使用すると、例外をキャッチして適切に処理できます。例外が発生するかどうかにかかわらず、ブロックを実行したい場合があります。このような場合は、次の構文を使用してtry...catch...finally文を使用できます。

try {
  // code may cause exceptions
} catch (error) {
  // code to handle exceptions
} finally {
  // code to execute whether exceptions occur or not
}
Code language: JavaScript (javascript)

この構文では、finallyブロックは、tryブロックとcatchブロックが完了した後、例外が発生するかどうかにかかわらず常に実行されます。

次のフローチャートは、try...catch...finallyの動作を示しています。

JavaScript try...catch...finally

JavaScript try…catch…finally文の例

次の例は、try...catch...finally文の使用方法を示しています。

let result = 0;
try {
  result = add(10, 20);
} catch (e) {
  console.log(e.message);
} finally {
  console.log({ result });
}Code language: JavaScript (javascript)

出力

add is not defined
{ result: 0 }Code language: CSS (css)

動作方法。

まず、result変数を宣言し、その値を0で初期化します。

let result = 0;Code language: JavaScript (javascript)

次に、tryブロック内でadd()関数を呼び出し、戻り値をresult変数に代入します。add()関数は存在しないため、JavaScriptエンジンは例外を発生させます。

例外が発生したため、catchブロック内のステートメントが実行され、エラーメッセージが表示されます。

第三に、tryブロック内でresultを出力します。

次の例では、add()関数を定義し、tryブロック内で呼び出します。

const add = (x, y) => x + y;

let result = 0;

try {
  result = add(10, 20);
} catch (e) {
  console.log(e.message);
} finally {
  console.log({ result });
}
Code language: JavaScript (javascript)

出力

{ result: 30 }Code language: CSS (css)

add()関数が存在するため、tryブロックで例外は発生しません。したがって、finallyブロックはresult変数の値(10と20の合計)を出力します。

どちらの例でも、finallyブロックは常に実行されます。

try…catch…finallyとreturn

finallyブロックは、例外が発生するかどうかにかかわらず常に実行されます。また、return文など、実行を妨げることはできません。例えば

function fn() {
  try {
    return 1;
  } catch {
    return 2;
  } finally {
    return 3;
  }
}

console.log(fn());
Code language: JavaScript (javascript)

出力

3

この例では、tryブロックのreturn文は1を返します。したがって、fn()関数は1を返すはずです。しかし、そうではありません。

finallyブロックは常に実行されるため、finallyブロックのreturn文は3を返します。したがって、fn()関数は3を返します。

つまり、try...catch...finally文では、tryブロックとcatchブロックのreturn文は無視されます。

まとめ

  • 例外が発生するかどうかにかかわらずブロックを実行するには、try...catch...finally文でfinally節を使用します。
  • finallyブロックは常に実行されるため、try...catch...finally文はtryブロックとcatchブロックのreturn文を無視します。
このチュートリアルは役に立ちましたか?