プログラミングでエラーハンドリングといえばtry-catch
が基本ですが、実はもう一つのブロックfinally
をご存知でしょうか?finally
は、エラーの有無に関わらず必ず実行される処理を記述するための便利な構文です。本記事では、try-catch-finally
の役割と使い方について解説します。
finallyとは?
finally
は、try
ブロック内の処理が成功した場合でも、catch
ブロックでエラーが発生した場合でも、必ず実行される処理を記述するために使います。
try {
// 実行したいコード
} catch (error) {
// エラー時の処理
} finally {
// 成功・失敗に関わらず実行される処理
}
使い道
用途としては、ファイルのリソース開放が一番イメージしやすいですね。
const readFile = () => {
let fileHandle;
try {
fileHandle = openFile("example.txt");
console.log(fileHandle.read());
} catch (error) {
console.error("Error reading file:", error);
} finally {
if (fileHandle) {
fileHandle.close();
console.log("File closed.");
}
}
};
try-catchどちらの場合も実行したい処理を書く場合、両方のブロックに書くなんてアホなことする人はいないと思いますが(多分過去の自分は書いたけど)、finallyを使わないと以下のようになります。シンプルにtry-catchの外に書けばいいだけですね。
const readFile = () => {
let fileHandle;
try {
fileHandle = openFile("example.txt");
console.log(fileHandle.read());
} catch (error) {
console.error("Error reading file:", error);
}
// finallyの代替コード
if (fileHandle) {
fileHandle.close();
console.log("File closed.");
}
};
じゃあ一つ目と二つ目が一緒ならfinallyがある意味ないんじゃない。。??(しいて言えば可読性が上がる??)と思いましたが、以下の記事を発見。これ以上ないほど分かりやすい説明だったので丸投げ紹介します。
余談ですが、finallyを知ったきっかけがCopilotが提案したコードに出てきたからです。独学者にとって「AIコード生成→動作確認→コードの意味調べ」という流れもありかもですね。