PHPの例外処理(Exception, throw, try, catch, finally)
- 例外とは何か?
- try…catch の基本
- throw で例外を発生させる
- finally の使い方
- Exception クラスの詳細
- カスタム例外クラスの作成
- ネストした例外処理
- 複数の catch ブロック
- 例外の再スロー(rethrow)
例外とは何か?
PHPでは、プログラムの実行中にエラーが発生した場合、通常のエラーメッセージの他に「例外(Exception)」を使ってエラー処理を行うことができます。
例外を使うことで、エラーが発生してもプログラムを適切に処理し、異常終了を防ぐことができます。
try…catch の基本
PHPの例外処理は、try
ブロックと catch
ブロックを使って記述します。
try {
// 例外を発生させる可能性のあるコード
} catch (Exception $e) {
// 例外が発生した場合の処理
}
例えば、ゼロ除算のエラーをキャッチする例を見てみましょう。
try {
$a = 10;
$b = 0;
if ($b === 0) {
throw new Exception("ゼロで割ることはできません");
}
echo $a / $b;
} catch (Exception $e) {
echo "エラー: " . $e->getMessage();
}
throw で例外を発生させる
例外を発生させるには throw
を使います。
throw new Exception("エラーメッセージ");
次のコードでは、負の数が入力された場合に例外を発生させます。
function checkNumber($number) {
if ($number < 0) {
throw new Exception("負の数は許可されていません: " . $number);
}
return "OK";
}
try {
echo checkNumber(-5);
} catch (Exception $e) {
echo "エラー: " . $e->getMessage();
}
finally の使い方
finally
ブロックを使うと、例外の有無にかかわらず実行されるコードを指定できます。
try {
throw new Exception("エラー発生");
} catch (Exception $e) {
echo "例外をキャッチ: " . $e->getMessage();
} finally {
echo "必ず実行される処理";
}
Exception クラスの詳細
PHPの Exception
クラスには、いくつかの便利なメソッドがあります。
getMessage()
: 例外のメッセージを取得getCode()
: 例外のコードを取得getFile()
: 例外が発生したファイルを取得getLine()
: 例外が発生した行番号を取得
例:
try {
throw new Exception("カスタムエラーメッセージ", 100);
} catch (Exception $e) {
echo "メッセージ: " . $e->getMessage();
echo "コード: " . $e->getCode();
echo "ファイル: " . $e->getFile();
echo "行: " . $e->getLine();
}
カスタム例外クラスの作成
PHPでは独自の例外クラスを作成できます。
class MyException extends Exception {}
try {
throw new MyException("カスタム例外発生");
} catch (MyException $e) {
echo "カスタム例外キャッチ: " . $e->getMessage();
}
ネストした例外処理
例外の中でさらに例外をスローすることもできます。
try {
try {
throw new Exception("最初の例外");
} catch (Exception $e) {
echo "ネスト内キャッチ: " . $e->getMessage();
throw new Exception("再スローされた例外");
}
} catch (Exception $e) {
echo "外部キャッチ: " . $e->getMessage();
}
複数の catch ブロック
異なる種類の例外をキャッチするには、複数の catch
ブロックを使います。
class FirstException extends Exception {}
class SecondException extends Exception {}
try {
throw new FirstException("First Exception 発生");
} catch (FirstException $e) {
echo "FirstException をキャッチ: " . $e->getMessage();
} catch (SecondException $e) {
echo "SecondException をキャッチ: " . $e->getMessage();
}
例外の再スロー(rethrow)
catch ブロック内で例外を再スローできます。
try {
try {
throw new Exception("元の例外");
} catch (Exception $e) {
echo "キャッチ: " . $e->getMessage();
throw $e; // 再スロー
}
} catch (Exception $e) {
echo "再スローされた例外をキャッチ: " . $e->getMessage();
}