6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2022年1月27日 JavaScript (JS Primer)例外処理

try...catch構文

例外が発生しうるブロックをマークし、例外が発生したときの処理を記述するための構文です。

try...catch構文のtryブロック内で例外が発生すると、tryブロック内のそれ以降の処理は実行されず、catch節に処理が移行します。 catch節は、tryブロック内で例外が発生すると、発生したエラーオブジェクトとともに呼び出されます。 finally節は、tryブロック内で例外が発生したかどうかには関係なく、必ずtry文の最後に実行されます。

次のコードでは、tryブロックで例外が発生し、catch節の処理が実行され、最後にfinally節の処理が実行されます。

try {
    console.log("try節:この行は実行されます");
    // 未定義の関数を呼び出してReferenceError例外が発生する
    undefinedFunction();
    // 例外が発生したため、この行は実行されません
} catch (error) {
    // 例外が発生したあとはこのブロックが実行される
    console.log("catch節:この行は実行されます");
    console.log(error instanceof ReferenceError); // => true
    console.log(error.message); // => "undefinedFunction is not defined"
} finally {
    // このブロックは例外の発生に関係なく必ず実行される
    console.log("finally節:この行は実行されます");
}

また、catch節とfinally節のうち、片方が存在していれば、もう片方の節は省略できます。 finally節のみを書いた場合は例外がキャッチされないため、finally節を実行後に例外が発生します。

// catch節のみ
try {
    undefinedFunction();
} catch (error) {
    console.error(error);
}
// finally節のみ
try {
    undefinedFunction();
} finally {
    console.log("この行は実行されます");
}
// finally節のみでは例外がキャッチされないため、この行は実行されません

上の例文ではcatch内でconsole.log(error);とせずにconsole.error(error)となっています。

console.errorについて

デバッガの Web コンソールにエラーメッセージを出力します。
(参照)MDN リファレンス

throw文

throw文を使うとユーザーが例外を投げることができます。 例外として投げられたオブジェクトは、catch節で関数の引数のようにアクセスできます。 catch節でオブジェクトを参照できる識別子を例外識別子と呼びます。

次のコードでは、catch節のerror識別子でキャッチしたエラーオブジェクトを参照しています。

try {
    // 例外を投げる
    throw new Error("例外が投げられました");
} catch (error) {
    // catch節のスコープでerrorにアクセスできる
    console.log(error.message); // => "例外が投げられました"

エラーはnew演算子で生成することが出来ます。

const yano = new Error("例外が投げられました");
console.log(yano);

以下のようにエラーが出力されました。

ポイント

  • tryのブロック内で例外が発生した場合はその時点で次の処理に以降します。

  • finallyは必ず実行されます。もし、catchがない状態で例外が発生していた場合はfinallyの後にtryで発生した例外が返ります。

  • try...catch構文はどういう時に使うのか
    例外が発生するケースの処理に、例外が起きた際の処理を用意しておくために使います。

参考

JS primer 例外処理