技術コンテンツ

【JavaScript】例外処理(try-catch-finally) - 予期せぬエラーの対応処理

【JavaScript】例外処理(try-catch-finally) - 予期せぬエラーの対応処理

JavaScriptの例外処理について解説します。

検証環境

例外処理

例外処理は“例外が発生した際の復帰処理”のことです。

例外が発生した場合にプログラムが中断しないように例外処理を施します。

※ 致命的な(プログラムで対応できない)エラーは例外処理できません。

JavaScriptではtry-catch-finally文で例外処理を実現します。

基本構文

try {
    // 処理...
} catch ( 変数 ) {
    // 例外処理...
} finally {
    // 処理...
}

例外処理はtryブロック、catchブロック、finallyブロックの3つのブロックから構成されます。

try

tryブロックは通常実行する処理を記述します。

このブロック内の処理で例外が発生した場合、以降の処理を中断してcatchブロックに移行します。

また、そのことを『例外のキャッチ』と呼びます。

catch

catchブロックは例外が発生した場合に実行する処理を記述します。

tryブロックで発生した例外はオブジェクトとして、引数のように変数で受け取って扱うことが可能です。

finally

finallyブロックは例外の発生有無に関わらず必ず実行する処理を記述します。

tryブロックまたはcatchブロックの終了後に実行されます。

なお、このブロックは必須ではありません。

サンプル

先ずは例外を発生するコードを確認しましょう。

let result = 0;

result = x + y;

console.log(result);
Uncaught ReferenceError: x is not defined

このコードは宣言されていない変数xyを使用したことにより例外が発生します。

例外によりプログラムが中断されるため、console.log(result)は実行されません。

例外から復帰するように例外処理を適用すると次のようなコードになります。

let result = 0;

___ih_hl_start
try {
    result = x + y;
} catch( e ) {
    console.log(e);
}
___ih_hl_end

console.log(result);
ReferenceError: x is not defined
0

変数eには例外オブジェクトが与えられます。

catchブロックで出力するとエラーの内容が表示できます。

また、コンソールの0console.log(result)の出力によるものです。

このように例外処理を施すことで、例外が発生してもプログラムを終了せずに復帰することができます。

また、さらにfinallyブロックを追加します。

console.log("START");

let result = 0;

try {
    result = x + y;
} catch( e ) {
    console.log(e);
} finally {
    console.log("FINALLY");
}

console.log(result);

console.log("FINISH");
START
ReferenceError: x is not defined
    at sample.js:3023:5
FINALLY
0
FINISH

実行結果からcatchブロックの終了後、finallyブロックが実行されたことが分かります。

例外が発生しないパターンも確認します。

console.log("START");

let result = 0;
___ih_diff_start
+let x = 1, y = 2;
___ih_diff_end

try {
    result = x + y;
} catch( e ) {
    console.log(e);
} finally {
    console.log("FINALLY");
}

console.log(result);

console.log("FINISH");
START
FINALLY
3
FINISH

例外は発生しませんが、実行結果からfinallyブロックが実行されたことが分かります。