PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHP例外処理のfinallyブロック完全解説:必ず実行される後処理の書き方

はじめに

PHPの例外処理において、finallyブロック内のコードは、tryブロックで例外が発生したかどうかにかかわらず、必ず実行されます。finallyブロックはcatchブロックの後に記述するか、catchブロックを省略してtryブロックの直後に配置することができます。

この仕組みは、ファイルのクローズやデータベース接続の解放など、エラーの有無に関係なく実行したい後処理(クリーンアップ処理)を記述する際に非常に役立ちます。

catchブロックとfinallyブロックを併用する場合

次の例では、catchブロックとfinallyブロックの両方が定義されています。

  • tryブロック内で例外が発生した場合:catchブロックとfinallyブロックの両方が実行される
  • tryブロック内で例外が発生しなかった場合:finallyブロックのみが実行される

サンプルコード

<?php
function div($x, $y) {
   if (!$y) {
      throw new Exception('Division by zero.');
   }
   return $x/$y;
}
try {
   echo div(10,0) . "\n";
} catch (Exception $e) {
   echo 'Caught exception: ', $e->getMessage(), "\n";
}
finally{
   echo "This block is always executed\n";
}
// 処理はここから継続される
echo "Execution continues\n";
?>

実行結果

このコードを実行すると、以下の出力が表示されます。

Caught exception: Division by zero.
This block is always executed
Execution continues

例外が発生しない場合の動作

次に、tryブロック内の呼び出しを変更し、例外が発生しないようにしてみましょう。

サンプルコード

<?php
function div($x, $y) {
   if (!$y) {
      throw new Exception('Division by zero.');
   }
   return $x/$y;
}
try {
   echo div(10,5) . "\n";
} catch (Exception $e) {
   echo 'Caught exception: ', $e->getMessage(), "\n";
}
finally{
   echo "This block is always executed\n";
}
// 処理はここから継続される
echo "Execution continues\n";
?>

実行結果

今度は例外が発生しないため、catchブロックはスキップされ、以下のように出力されます。

2
This block is always executed
Execution continues

この結果から、例外の有無にかかわらずfinallyブロックが常に実行されていることが確認できます。

finallyブロックのみを使用するケース

PHPでは、catchブロックを持たず、finallyブロックだけを記述することも可能です。次の例では、2つのtryブロックが使用されています。

  • 1つ目は関数div()内部のtry-catch構成で、ここで例外が捕捉されます
  • 2つ目はcatchブロックを持たないtry-finally構成です

外側のtryブロックはdiv関数を呼び出し、この関数が例外をスローしますが、内部で既に捕捉済みのため、プログラムは正常に継続します。

サンプルコード

<?php
function div($x, $y){
   try{
      if (!$y) {
         throw new Exception('Division by zero.');
      }
      return $x/$y;
   }
   catch (Exception $e) {
      echo 'Caught exception: ', $e->getMessage(), "\n";
   }
}
try {
   echo div(10,0) . "\n";
}
finally{
   echo "This block is always executed\n";
}
// 処理はここから継続される
echo "Execution continues\n";
?>

実行結果

このコードを実行すると、以下の出力が表示されます。

Caught exception: Division by zero.

This block is always executed
Execution continues

まとめ

finallyブロックは、例外処理における「後片付け」を確実に行うための重要な機能です。主なポイントは以下の通りです。

  • finallyブロックのコードは、例外の発生有無にかかわらず必ず実行される
  • catchブロックと併用できるほか、catchブロックなしで単独でも使用可能
  • リソースの解放やログ出力など、確実に実行したい処理の記述に最適

例外処理を適切に設計することで、予期しないエラーが発生しても安全にプログラムを継続させることができます。

  1. Javaのtry-catchによる例外処理の基本とfinallyの使い方を徹底解説

    どんなに優れたプログラマーでも、コードにミスを犯すことはあります。タイプミス、予期しないユーザー入力、追跡が難しいさまざまな要因によって、エラーは発生します。 そこで活躍するのが「例外処理」です。質の高いコードには例外ハンドラーが組み込まれており、エラーが発生した際にあらかじめ定義された方法で対応できるようになっています。例外ハンドラーは、プログラムがエラーに遭遇したときにどう振る舞うべきかを指示してくれるため、非常に有用です。 Javaでは、try...catchブロックを使って例外処理を行います。この記事では、例外処理の基礎知識から、try...catchブロックを使った例外の処理方法、さ

  2. C++の例外処理入門!try・catch・throwの基本と標準例外クラス一覧

    C++における例外処理(Exception Handling)とは、プログラムの実行時に発生するエラー(ランタイムエラー)を適切に扱うための仕組みです。例外とは、実行時に送出(スロー)されるイベントのことで、C++ではすべての標準例外が std::exception クラスから派生しています。もし例外を捕捉しなかった場合、例外メッセージが出力され、プログラムは強制終了してしまいます。 C++標準では、例外関連のクラスが <exception> ヘッダに定義されており、プログラムの中で自由に利用できます。親子関係によるクラス階層は次のようになっています。 C++の主な標準例外クラス