こんにちは!
ナビゲータのEVEです。
今日はまったりと過ごしてしまいました。
っということで、今から活動するという感じなのですが、まったりした時間の中で、いろいろ決めたことがありますので、御報告します。
[エラー処理]
エラー処理で、try〜catchの利用する場面ですが、システム的なエラーで発生するときに使用するというアバウトな感じで導入します。
昨日あれから、プログラムを見直してみたのですが、try〜catchを使用するタイミングとそうで無いプログラムの境目を付けることができませんでした。まっ、検討前とあまり変わらないって言う感じなのですが・・・。ただ、try〜catchを利用する上で、どのExceptionを利用するのか決めました。
★Exception
用途
一般的な例外のベースクラスとして使用。
具体的な使用例
特定の目的で独自例外クラスを定義せず、汎用的なエラーを表す場合。
★RuntimeException
用途
実行時のロジックエラーを表す。
具体的な使用例
実行中の状態が不正な場合(例: 設定ファイルが読み込まれていない場合)。
★InvalidArgumentException
用途
メソッドや関数の引数が期待される形式や値ではない場合に使用。
具体的な使用例
引数が null であってはならない場合、または数値の範囲外の値が渡された場合。
★OutOfRangeException
用途
値が期待される範囲外である場合に使用。
具体的な使用例
配列のインデックスやパラメータが想定の範囲外である場合。
★OverflowException
用途
演算によって許容範囲を超えた場合に使用。
具体的な使用例
計算結果がシステムやアルゴリズムの上限を超えた場合(例: 値が INT_MAX を超えた)。
★UnderflowException
用途
演算が許容範囲の下限を超えた場合に使用。
具体的な使用例
スタックから値を取得しようとしたが空だった場合。
★BadMethodCallException
用途
不正または存在しないメソッドを呼び出した場合に使用。
具体的な使用例
クラスのメソッドが存在しない場合(例: 直接呼び出せないマジックメソッドを使用しようとした)。
★UnexpectedValueException
用途
値が期待に反して不正である場合に使用。
具体的な使用例
関数の戻り値が想定と異なる場合(例: ファイルの読み込みで数値を期待していたが文字列が返された)。
★TypeError
用途
データ型が期待と異なる場合に使用。
具体的な使用例
引数や戻り値の型が指定された型と一致しない場合(例: int 型を期待したが string が渡された)。
★DivisionByZeroError
用途
数値をゼロで割った場合に使用。
具体的な使用例
除算演算でゼロ除算が発生した場合。
★Error
用途
プログラムの致命的なエラーを表す。
具体的な使用例
メモリ不足やシステムエラーなど、回復不能なエラー。
現在は、とりあえず、Exceptionエラーで済ませていますが、今後は、以上のExceptionを使い分けて製造していきたいと思います。多分ですが、それ以外は使わないと思っています。
[Exceptionを使い分ける理由]
実は、今までは、使い分けなくても困らなかったのですが、PHP開発プロジェクトでは、なぜ使い分けているのでしょうか?理由についてChatGPTに聞いてみました。
❶エラーの特定と管理が容易になる
例外の種類ごとに意味が明確であるため、エラーの原因を特定しやすくなります。
たとえば:
InvalidArgumentException をキャッチした場合、「引数が無効」という明確な意味があり、エラーの原因を迅速に理解できます。
DivisionByZeroError をキャッチした場合、「ゼロ除算が原因」という情報がすぐにわかります。
これにより、デバッグやログ解析が効率的になります。
❷エラーハンドリングを柔軟にできる
特定の例外だけをキャッチして処理を分岐させることが可能です。
❸コードの意図を明確にする
適切な例外クラスを使用することで、コードの意図を明確に伝えることができます。
たとえば、LogicException 系の例外はプログラムのロジックミスを示し、開発者がコードを修正する必要があることを示唆します。一方、RuntimeException 系の例外は、実行時に予期せぬ状態が発生したことを示します。
こうした区別により、コードを読む他の開発者もエラーの背景を理解しやすくなります。
❹フレームワークやライブラリとの互換性
多くのPHPフレームワークやライブラリでは、例外の種類ごとに異なるエラーハンドリングを実装していることがあります。適切な例外を使用することで、これらのフレームワークやライブラリとの連携がスムーズになります。
■まとめ
例外の種類を適切に使い分けることで:
・エラーの特定とデバッグが簡単になる
・エラーハンドリングが柔軟になる
・コードの意図を明確に伝えられる
・フレームワークやライブラリとの互換性が向上する
これらのメリットにより、コードの品質やメンテナンス性が向上します。
これを読むと使い分けるしかないって感じですね(笑)。
[Throwableインターフェース]
昨日のブログで、try〜catchがPHP5.0で実装され、ThrowableインターフェースがPHP7.0から実装されたっていう記事なんか違和感感じませんでした?Throwableインターフェースって、Exceptionより上位にあるのに、Exceptionは、try〜catchが利用できた、PHP5.0から利用できたということを意味するからです。子が先に生まれ、親が後から生まれたって感じになっているのです。
理由をChatGPTに確認したところ、PHPの開発プロジェクトでは、開発を進めていく過程で、Exceptionだけでは、機能不足だと感じたらしいです。Errorもできれば、利用できるようにしたい・・・。っということで、Exceptionの上位に、Throwableインターフェースを持ってきて、ExceptionとErrorを利用できるようにしたというのが理由らしいです。そういえば、PHPって、ver6ありませんもね・・・。この時期いろいろな検討が行われる中で、そう決まったのだと思います。
[あとがき]
なんてことを考えながら、開発環境も決めました。ECLIPSEです。実は、ECLIPSEより、Visual Studioの方が利用を開始したのは先なのですが、開発体制と言ったらいいでしょうか?自分の現在の開発体制と同じような境遇を感じるので、ECLIPSEを利用することにしました。私と一緒にされても困ると思いますが、共感したってことです。
使用方法は、秀丸であらあら製造したものを、ChatGPTでデバックし、ECLIPSEの環境に移して、移したモノを再デバックするというイメージになると思います。
ECLIPSEを使用してみたのですが、さくさく動くって感じじゃないですね?サクサクと作るなら、やはり秀丸は最高です!
まだ、PHPでECLIPSEを開発したことがないので、現在自分の頭の中でイメージした通りになるかどうか分かりませんが、これから、ECLIPSEの使い方を勉強しながら、動画を作り、自分のモノにしていきたいと思っています。
では、また!