カテゴリ: JavaScript 更新日: 2026/05/28

JavaScriptのfinally句とは?初心者でもわかる例外処理とリソース解放のベストプラクティス

JavaScriptのfinally句とは?リソース解放のベストプラクティス
JavaScriptのfinally句とは?リソース解放のベストプラクティス

先生と生徒の会話形式で理解しよう

生徒

「先生、JavaScriptでエラーが発生したときに必ず実行される処理ってありますか?」

先生

「あります。それがfinally句です。try-catch構文と一緒に使うことで、エラーがあってもなくても必ず実行される処理を定義できます。」

生徒

「具体的にはどのように使うんですか?」

先生

「では、基本的な使い方から順番に見ていきましょう!」

1. finally句の基本的な考え方

1. finally句の基本的な考え方
1. finally句の基本的な考え方

JavaScriptのfinally句は、例外処理の後で必ず実行したい処理を書く場所です。たとえば、ファイルを開いたり、データベースに接続したりした後で、必ず閉じる処理を実行したい場合に使います。tryで正常な処理を行い、catchでエラーを処理し、finallyで後片付けを行うのが基本です。

2. 基本的なfinally句の使い方

2. 基本的なfinally句の使い方
2. 基本的なfinally句の使い方

まずは簡単な例を見てみましょう。


try {
  console.log("処理を開始します");
  // ここで何かの処理
  throw new Error("問題が発生しました");
} catch (error) {
  console.log("エラーをキャッチしました:", error.message);
} finally {
  console.log("finally句は必ず実行されます");
}

処理を開始します
エラーをキャッチしました: 問題が発生しました
finally句は必ず実行されます

このように、エラーが起きても起きなくてもfinally内の処理は必ず実行されます。

3. リソース解放にfinally句を使う

3. リソース解放にfinally句を使う
3. リソース解放にfinally句を使う

例えば、ファイルやデータベース接続などのリソースは、使い終わったら必ず閉じる必要があります。これをfinallyで実行すると安全です。


function readFile() {
  let file = null;
  try {
    file = openFile("data.txt"); // 仮想のファイルオープン関数
    console.log("ファイルを読み込み中...");
    // ファイル操作
  } catch (error) {
    console.log("ファイル読み込み中にエラー:", error.message);
  } finally {
    if (file) {
      file.close(); // ファイルは必ず閉じる
      console.log("ファイルを閉じました");
    }
  }
}

このようにfinally句を使うことで、エラーが発生してもファイルが閉じられずに残るリスクを避けられます。

4. return文があってもfinallyは実行される

4. return文があってもfinallyは実行される
4. return文があってもfinallyは実行される

JavaScriptでは、trycatchreturnがあってもfinallyは実行されます。


function testFinally() {
  try {
    console.log("tryブロック");
    return "try終了";
  } catch (e) {
    return "catch終了";
  } finally {
    console.log("finallyは必ず実行されます");
  }
}

console.log(testFinally());

tryブロック
finallyは必ず実行されます
try終了

この性質を理解しておくと、リソースの後片付けやログの出力などで役立ちます。

5. ネストしたtry-catch-finallyでも安全に処理

5. ネストしたtry-catch-finallyでも安全に処理
5. ネストしたtry-catch-finallyでも安全に処理

try-catch-finallyはネストして使うことも可能です。大きな処理の中で小さな処理があり、それぞれでエラー処理と後片付けを行いたい場合に便利です。


try {
  console.log("外側の処理開始");
  try {
    console.log("内側の処理開始");
    throw new Error("内側の問題");
  } catch (e) {
    console.log("内側のエラー:", e.message);
  } finally {
    console.log("内側のfinally実行");
  }
} finally {
  console.log("外側のfinally実行");
}

外側の処理開始
内側の処理開始
内側のエラー: 内側の問題
内側のfinally実行
外側のfinally実行

6. 非同期処理でのfinallyの使い方

6. 非同期処理でのfinallyの使い方
6. 非同期処理でのfinallyの使い方

非同期処理でもfinallyは有効です。Promiseチェーンで使うと、処理後の共通の後片付けが簡単に書けます。


fetch("https://example.com/data")
  .then(response => response.json())
  .then(data => console.log("データ取得成功:", data))
  .catch(error => console.log("エラー発生:", error))
  .finally(() => console.log("非同期処理終了後は必ずここが実行されます"));

7. finally句を使ったベストプラクティス

7. finally句を使ったベストプラクティス
7. finally句を使ったベストプラクティス

finally句を活用することで、エラー発生時の安全性が高まり、リソースの解放やログ出力などを漏れなく行うことができます。基本的なポイントは以下の通りです。

  • ファイルやデータベースなどのリソースは必ずfinallyで閉じる
  • return文があってもfinallyは実行されることを意識する
  • ネストした処理でも後片付けを忘れない
  • 非同期処理でもfinallyを活用する

これらのポイントを押さえることで、JavaScriptの例外処理がより安全でわかりやすくなります。

まとめ

まとめ
まとめ

本記事では、JavaScriptのfinally句について、基本的な概念から具体的な活用方法まで詳しく解説しました。finally句は、tryブロックで処理を実行し、catchでエラーを処理した後に、必ず実行される処理を記述するための重要な構文です。これにより、ファイル操作やデータベース接続などのリソース管理が安全に行え、予期せぬエラーが発生しても後片付けを確実に行うことができます。

まず、基本的な使い方として、try-catch-finallyの順序と構造を理解することが大切です。finally句はエラーの有無にかかわらず必ず実行されるため、リソースの開閉やログ出力、状態の初期化など、後処理を漏れなく行う際に非常に有効です。

また、return文がtrycatch内にあっても、finally句は実行されることを理解しておく必要があります。これにより、関数の返り値を制御しつつ、リソースの解放やログの記録を確実に行うことが可能です。

ネストしたtry-catch-finally構造もサポートされており、大規模な処理の中でも個々の処理単位で安全にエラー処理と後片付けを実施できます。外側と内側のfinally句はそれぞれ独立して実行されるため、複雑な処理の整理やエラーの追跡にも役立ちます。

非同期処理においてもfinally句は有効で、Promiseチェーンの最後に配置することで、成功・失敗に関わらず必ず実行したい後処理を簡潔に記述できます。これにより、非同期通信後の共通処理やUIの状態更新、ローディング表示の解除などが安全に行えます。

さらに、ベストプラクティスとして押さえておきたいポイントは以下の通りです。

  • ファイルやデータベースなどのリソースは必ずfinallyで閉じる
  • 関数内でreturnがあってもfinallyは実行されることを意識する
  • ネストした処理でも後片付けを忘れない
  • 非同期処理でもfinallyを活用し、共通処理をまとめる

これらの理解を深めることで、JavaScriptにおける例外処理がより安全で堅牢になり、予期せぬエラーやリソース漏れを防ぐことができます。finally句は初心者にとっても扱いやすく、適切に使うことでコードの可読性と信頼性を高められます。

先生と生徒の振り返り会話

生徒

「先生、finally句はどうしてそんなに重要なんですか?」

先生

「finally句は、エラーの有無に関わらず必ず実行されるので、リソースの後片付けやログ出力に使えるんだ。例えば、ファイルを開いたら必ず閉じる、データベースに接続したら必ず切断するといった処理が安全に書けるんだよ。」

生徒

「なるほど。returnがあっても実行されるんですね?」

先生

「そうだよ。関数の返り値が決まる前でも、finally句は必ず実行される。だから、returnがある関数内でも後片付けやログを確実に行えるんだ。」

生徒

「ネストしても大丈夫なんですか?」

先生

「もちろん。外側と内側のfinally句は独立して実行されるから、複雑な処理の中でもそれぞれ安全に後片付けができるんだ。」

生徒

「非同期処理でも使えるんですか?」

先生

「うん、Promiseチェーンの最後にfinallyを使うことで、通信が成功しても失敗しても必ず実行される処理をまとめられるよ。UIの更新やローディング解除などに便利なんだ。」

生徒

「じゃあ、finally句を正しく使うことで、例外処理が安全でわかりやすくなるんですね!」

先生

「その通り。初心者でもまずは基本的な構造と使い方を押さえれば、エラー発生時のリスクを減らしつつ、コードの可読性と信頼性を高められるんだ。」


// finally句の簡単な例
function exampleFinally() {
try {
console.log("処理開始");
throw new Error("エラー発生");
} catch (e) {
console.log("エラーをキャッチ:", e.message);
} finally {
console.log("必ず実行される処理");
}
}

exampleFinally();

処理開始
エラーをキャッチ: エラー発生
必ず実行される処理

このように、finally句を使えば例外があっても必ず実行される処理をまとめられるので、安全で信頼性の高いコードを書けます。

関連記事:
カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScriptの関数に型をつける方法(引数・戻り値)を初心者向けに徹底解説!
New2
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】
New3
TypeScript
TypeScriptでExpressのミドルウェアを型安全に定義する方法!バックエンド開発の初心者向け解説
New4
JavaScript
JavaScriptのfilterメソッドで条件に合う要素を抽出する方法
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptでフォームの値を取得する方法を徹底解説!valueプロパティの使い道
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptでHTML5バリデーションAPIを使いこなす!初心者でもわかるフォーム入力チェック
No.3
Java&Spring記事人気No3
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.4
Java&Spring記事人気No4
TypeScript
TypeScript学習におすすめの無料教材・リファレンスサイト【初心者向け】
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptで要素を削除する方法(removeChild, removeなど)
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.7
Java&Spring記事人気No7
JavaScript
JavaScriptの配列操作でよくあるエラーとその解決法まとめ
No.8
Java&Spring記事人気No8
JavaScript
JavaScriptの現在日時を取得する方法を完全ガイド!初心者でもわかるDate.now()とnew Date()