概要: このチュートリアルでは、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文の例
次の例は、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
文を無視します。