finallyブロックを使った例外処理の終了時の動作をわかりやすく解説

スポンサーリンク
スポンサーリンク

finallyの概要

例外処理の終了時のコード実行 JavaScript予約語

finally

概要 finallyは、try...catch構文で使用され、例外の発生有無に関係なく、必ず実行されるコードを記述するためのブロックです。

わかりやすく説明 finallyは「エラーがあってもなくても、この部分だけは必ず最後に実行する」という動作を保証する仕組みです。

  • tryブロックで例外が発生しても、finallyは実行されます。
  • リソースの解放やクリーンアップ処理に適しています。
  • finallyは省略可能ですが、重要な後処理がある場合に使用されます。

finallyの基本的な使い方

以下は、try...catch...finally構文を使用した例です。

// try...catch...finallyの基本例
try {
    console.log("処理を開始します。");
    let result = 10 / 0; // エラーは発生しません(Infinityを返す)
    console.log("結果:", result);
} catch (error) {
    console.error("エラーが発生しました:", error.message);
} finally {
    console.log("このブロックは必ず実行されます。");
}

// 出力:
// 処理を開始します。
// 結果: Infinity
// このブロックは必ず実行されます。
  • finallyブロックの内容は、エラーの有無に関係なく実行されます。
  • クリーンアップ処理や終了ログの記録などに使用されます。

finallyの応用例

finallyを使用して、リソースを解放したり重要な終了処理を記述できます。

// ファイル操作の例(疑似コード)
function processFile() {
    const file = openFile("data.txt"); // ファイルを開く
    try {
        console.log("ファイルを処理しています...");
        // ファイル処理ロジック(例: 読み込み、書き込み)
        throw new Error("処理中に問題が発生しました!");
    } catch (error) {
        console.error("エラー:", error.message);
    } finally {
        closeFile(file); // ファイルを閉じる
        console.log("リソースを解放しました。");
    }
}

processFile();
  • finallyは、リソースを正しく解放するためのコードを記述するのに適しています。
  • 例外がスローされても、リソース解放コードは実行されます。

try…catchとの違いと組み合わせ

finallyは、tryブロックとcatchブロックと共に使用されますが、catchを省略してfinallyのみを使うことも可能です。

// catchを省略した例
try {
    console.log("データベースに接続中...");
    // データベース操作
} finally {
    console.log("接続を閉じます。"); // 接続のクリーンアップ
}
  • catchを省略した場合でも、finallyは実行されます。
  • 後処理だけが必要なケースで使用されます。

注意点

  • 必ず実行される保証: finallyは通常のコードフローであっても例外がスローされても実行されます。ただし、process.exit()などでプロセスが強制終了した場合はスキップされることがあります。
  • catchが省略可能: tryブロックとfinallyブロックだけで使用できますが、例外処理が必要な場合はcatchも併用してください。
  • リソースの解放を意識: ファイル、ネットワーク接続、データベース接続などのリソースを必ず解放するコードを記述しましょう。

よくある質問

Q: finallyの内容は、returnがある場合も実行されますか?
A: はい、tryまたはcatchブロック内にreturnがあっても、finallyの内容は実行されます。
Q: finallyの内容がエラーをスローする場合はどうなりますか?
A: finally内でエラーがスローされた場合、そのエラーが呼び出し元に伝播します。tryまたはcatch内のエラーは上書きされます。
Q: finallyを使わずに代替する方法はありますか?
A: 可能ですが、コードが冗長になる可能性があります。finallyを使うことで、リソース解放コードや後処理を簡潔に記述できます。

まとめ

finallyは、例外処理において後処理を確実に実行するための便利な構文です。

  • tryブロックの成功や失敗に関係なく、finallyのコードは実行されます。
  • リソースの解放や終了処理に役立ちます。
  • 例外処理を安全に行うために、適切にfinallyを活用しましょう。