finallyの概要
| 例外処理の終了時のコード実行 JavaScript予約語 | ||
|
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を活用しましょう。