こんにちは!
ナビゲータのEVEです。
価格:3,740円 |
本日は、予定通り、例外処理から読み始め、次期システムへどのように例外処理を入れるのか検討をしています。
[例外処理]
PHPの例外処理の構造ですが、こんな感じだそうです。
Exception
┣ErrorException
┣LogicException
┃ ┣BadFunctionCallException
┃ ┃ ┗BadMethodCallException
┃ ┣DomainException
┃ ┣InvalidArgumentException
┃ ┣LengthException
┃ ┗OutOfRangeException
┗RuntimeException
┣OutOfBoundsException
┣OverflowException
┣PDOException
┣RangeException
┣UnderflowException
┗UnexpectedVaueException
大きく分けると、樹形図の最上位にある、上から2、3番目のLogicExceptionとRuntimeExceptionが例外処理になります。
通常の運用は以下のようなロジックでいいのですが、デバックモード(*1)にした場合は、より細かいエラーが欲しいと誰しも考えます。その場合は、下位のレベルのExceptionを利用することが望ましいそうです。
ここでの作りは、多分、catch (Exception $e)と指定しておいて、例外をキャッチした場合で、システム自体がデバックモードになっていた場合、詳細なエラーを出力するように記述した方がようさそうです。catchの中に複数のExceptionを記述することも可能で、先に記述されたcatchが優先されるらしいです。当該箇所に関係しそうで、より下位のレベルのExceptionを先に記述しておいて、その後に、catch (Exception $e)といった記述にするという方法も考えられます。原則として
より下位の例外を先に、上位の例外クラスは後に記述
と言う原則があるようです。
try {
....任意のコード
} catch (Exception $e) {
....例外処理
}
[throwを利用する]
catchの順番を変える以外に、throwを利用する方法があるようです。catch (Exception $e)で取得したエラーの詳細を、デバックモードが有効な場合、throwで詳細なエラーを取るというのはどうでしょう?一度上位のメソッドでcatchしているので、そのあとにthrowしても詳細なエラーがとれるか微妙なところですが、ちょっと試してみたいと思います。
そして、throwは、PHP7までは、ステートメントとしてしか、利用できなかったのですが、PHP8からは式として利用できるようになったそうです。
[スタックトレースを利用する]
スタックトレースは、例外が発生するまで経てきたメソッド(関数)の履歴です。エントリーポイント(開始位置)から、呼び出し順に記録されます。これは、デバックにはかなり有効な機能になりそうです。使用するには、getTrace、getTraceAsStringメソッドを使って取得します。ただ、「独習PHP」には、使用例が載っていません。インターネットで確認するしかないようです。
[独自の例外クラス]
以外の方法として、独自の例外クラスを用意するという方法があります。インターフェースを用いて、適切な継承で、独自の例外クラスを作る必要があります。1つスーパークラスを作るという方法があるのですが、問題があるそうです。エラーの内容が、多岐にわたる場合、LogicException、RuntimeExceptionにまたがるような場合です。そのため、適切に分けることが推奨されます。
そして、このとき利用するインターフェースをマーカーインターフェースと言い、クラスを判別しやすくするそうです。
最後のこれがいいかなってこのブログをつけている現在は、考えています。理由は、例外処理を自分で作成し、それを分かるような形にしておけば、PHP本体の仕様変更にも容易に対応できそうだからです。この辺は作って見ないとわかりませんが・・・・。
[あとがき]
今日、今後のことを書こうとしたのですが、結局例外処理に時間が取られてしまいました。ただ、明日は、必ず、発表します。
例外処理は、すべての処理の共通の処理になり、かつプログラム総ステップの半分を占めるといっていいでしょう?その事実を踏まえれば、ここに時間をかけ検討することは、非常に重要なことだと考えます。
っということで、本日は、例外処理を重点的に書かせていただきました!
では、また!!!
*1)Prototype EVEには、デバックモードというモードがあります。このモードにした場合、画面上へのエラーメッセージの出力、ログファイルへの詳細ログの出力が行われます。
【このカテゴリーの最新記事】