PHP – 雛形 – 複数の例外のチェーン

概要

複数のエラーを補足していって、まとめて表示するなどの処理をしたい場合がある。たとえばユーザーIDとパスワードの妥当性をチェックし、それぞれのエラーを全て表示したいような場合。

このようなケースで例外を使うと、例外が発生した場合や意図的にスローした場合、その時点で例外処理に移行するので、複数のエラーを扱い難い。

Exception::getPrevious()

Exceptionクラスのコンストラクターは、3つの引数をとることができる。

public __construct (string $message = "", int $code = 0, Throwable $previous = null )

3つ目の引数はThrowableで、この引数にExceptionオブジェクトを指定すると、新たに生成されたオブジェクトの前に発生したExceptionオブジェクトがスタックに保持される。

$new_ex = new Exception('this exception', 0, $previous_ex)

最終的に得られたExceptionオブジェクトのスタック上にそれ以前のExceptionオブジェクトがある場合、getPrevious()メソッドで直前のオブジェクトが得られる。直前のExceptionオブジェクトがない場合はgetPrevious()の戻り値はnullとなる。

基本形

これらのことを利用して、複数の例外を途中で抜け出さずに蓄積する方法は以下のようになる。

  • 2行目の初期化は、1番目・・・n番目のどこが最初の例外をスローするかが確定していないため必須。
  • 17~19行目、適切な位置で例外をスローしないと反映されないが、例外が発生していない場合はスローしない

実行例

以下は実行例。1つ目と3つ目の条件式がfalseなので例外が積み重ねられ、2つ目はtrueなのでそのまま表示、そのあとに積まれた例外が表示される。

関数化・配列への格納

Exceptionオブジェクトの積み込みと、例外発生時のみの例外スロー、スタックされた例外に対する操作を関数化しておくと、再利用しやすく可読性も上がる。

18行目で配列の順序を反転し、スタックに積まれた順番(LIFO)からFIFOのリスト順にしている。

これらの関数を使って先と同じ処理をするコード

関数での例外発生のトレース

最初の関数で発生した例外への過程をスタックに残すには、以下のように関数内で前の例外を登録してスローする。

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です