PHPのネストした例外処理(try-catchの入れ子構造)をわかりやすく解説
はじめに
PHPでは、try-catchブロックを任意の深さまで入れ子(ネスト)にすることができます。例外は出現順とは逆の順序で処理され、最も内側のブロックから先に捕捉・処理されるのが特徴です。本記事では、ネストした例外処理の基本的な動作と、具体的なサンプルコードを通じてその仕組みを解説します。
ネストしたtry-catchの基本動作
以下の例では、内側のtryブロックが2つの変数のどちらかが数値以外であるかどうかをチェックし、数値以外であればユーザー定義例外をスローします。一方、外側のtryブロックは、分母が0の場合にDivisionByZeroErrorをスローし、それ以外の場合は2つの数値の除算結果を表示します。
サンプルコード
<?php
class myException extends Exception {
function message(){
return "error : " . $this->getMessage() . " in line no " . $this->getLine();
}
}
$x = 10;
$y = 0;
try {
/* 内側のtryブロック:数値チェック */
try {
if (is_numeric($x) == FALSE || is_numeric($y) == FALSE)
throw new myException("Non numeric data");
}
catch (myException $m){
echo $m->message();
return;
}
/* 外側のtryブロック:ゼロ除算チェック */
if ($y == 0)
throw new DivisionByZeroError("Division by 0");
echo $x / $y;
}
catch (DivisionByZeroError $e){
echo $e->getMessage() . " in line no " . $e->getLine();
}
?>
実行結果
上記のコードを実行すると、次のような出力が得られます。
Division by 0 in line no 19
どちらか一方の変数を数値以外の値に変更すると、内側のcatch節がユーザー定義例外を捕捉し、次のように表示されます。
error : Non numeric data in line no 20
両方の変数が数値であれば、その除算結果がそのまま出力されます。
ネストした例外処理のポイント
- 任意の深さまでネスト可能: try-catchブロックは必要に応じて何重でも入れ子にできます。
- 内側から順に処理される: スローされた例外は、まず最も内側のcatch節で評価され、対応する例外型が見つからない場合は外側のtry-catchへ伝播します。
- 例外型の一致が必要: catch節は、指定したクラスまたはそのサブクラスの例外のみを捕捉します。
- 設計の工夫が重要: ネストが深くなりすぎるとコードの可読性が低下するため、エラーの種類ごとに責務を分けて設計することをおすすめします。
-
PHPのrestore_exception_handler()関数とは?使い方と実行例を解説
PHPのrestore_exception_handler()関数は、直前に設定されていた例外ハンドラを復元するための関数です。set_exception_handler()を使って例外ハンドラ関数を変更した後、この関数を呼び出すことで、以前の例外ハンドラ(組み込みのハンドラまたはユーザー定義関数)に戻すことができます。例外ハンドラはスタックのように管理されているため、set_exception_handler()を複数回呼び出した場合、restore_exception_handler()を実行するたびに、一つ前のハンドラへと順番に戻っていきます。構文restore_exception_ha
-
C#の例外処理とは?try・catch・finally・throwの基本を実例付きで解説
例外(Exception)とは、プログラムの実行中に発生する問題のことです。C#における例外は、プログラムの稼働中に生じた例外的な状況——たとえば「ゼロによる除算」のような事態——への応答として捉えられます。例外は、プログラム内のある部分から別の部分へ制御を移すための仕組みも提供しています。C#の例外処理は、以下の4つのキーワードを基盤として構築されています。try — tryブロックは、特定の例外を監視対象とするコードブロックを示します。このブロックの後には、1つ以上のcatchブロックが続きます。catch — 例外ハンドラーを使って例外を捕捉します。プログラムの中で問題を処理したい箇所に