この記事は株式会社カオナビ Advent Calendar 2024の21日目の記事です。
おにぎらずが好きです
PHPにおける例外(Exception)の基本
例外(Exception)とは?
プログラムの実行中に発生するエラーや異常を処理するためのメカニズムです。
PHP 内で例外がスローされ (throw され)、それが 捕捉され (catch され) ます。発生した例外を 捕捉するには、コードを try ブロックで囲みます。
マッチする catch ブロックが見つからない場合は、 グローバルな例外ハンドラが設定されていない限り fatal error となり、 プログラムが終了します。
https://www.php.net/manual/ja/language.exceptions.php
基本的な構文
PHPではtryブロック内で例外がスローされると、catchブロックでその例外をキャッチして処理します。
構文の例:
try {
// 例外が発生するコード
throw new Exception("エラーが発生しました。");
} catch (Exception $e) {
// 例外をキャッチして処理する
echo "例外がキャッチされました: " . $e->getMessage();
// 再スロー
throw $e;
}
echo "処理は継続しています";
実行結果
例外がキャッチされました: エラーが発生しました。
Fatal error: Uncaught Exception: エラーが発生しました。
おにぎりとは
Exceptionを補足し、再スローせずに処理を継続することです。
Exceptionを握りつぶす、の意味でおにぎりと言います。
try {
// 例外が発生するコード
throw new Exception("エラーが発生しました。");
} catch (Exception $e) {
// 例外をキャッチして処理する
echo "例外がキャッチされましたが握りつぶします: " . $e->getMessage();
// 再スローしない
}
echo "処理は継続しています";
実行結果
例外がキャッチされましたが握りつぶします: エラーが発生しました。処理は継続しています
おにぎり注意点
すべてのExceptionを握りつぶすことはしないほうがいいです。
アプリケーションの状態が不整合になったり、デバッグや監視が困難になったりする可能性があります。
特定のケースに当てはまる場合は、おにぎりしたい
あるケースに当てはまる場合だけおにぎりしたい場合、
特定のExceptionクラスを作ってそのExceptionだけ、おにぎりするといったやり方がよいでしょう。
class MyOnigiriException extends Exception {}
try {
throw new MyOnigiriException("おにぎりしたいカスタム例外が発生しました");
} catch (MyOnigiriException $e) {
echo "おにぎりします: " . $e->getMessage();
}
上記の場合、MyOnigiriException
はおにぎりされますが
それ以外のException
はスローされます。
特定のケースとはどういったものでしょうか?
特定のケースとはどういったものが考えられるでしょうか?
処理自体は成功にして、エラーがあったことをログを出すだけでとどめたい場合が考えられます。
例えば
-
ログファイルの書き込み失敗やログ通知の失敗
ログファイルの書き込みやログ通知の失敗はアプリケーションの正常な動作には不要であるため、失敗しても例外をスローせずに処理を続行することが考えられます。 -
処理終了後の一時ファイルの削除などのお掃除処理
アプリケーションの終了時に一時ファイルの削除などが失敗した場合、例外をスローせずに処理を続行することが考えられます。 -
オプションの機能
ユーザーが特定のオプション機能を使用するとき(例えば、操作ガイドモードなど)、その機能がうまく動かなくても基本機能には影響しない場合、その例外を握りつぶすことが考えられます。
まとめ
PHPの例外処理は、エラーの発生箇所とその処理を分離し、
堅牢なアプリケーションを作るための強力なツールです。
日々の開発にぜひ役立ててください!