例外は、見つけたエラーに基づいて入力する必要があります。Spl 例外は良い出発点ですが、実際には独自の例外も作成する必要があります。私が使用するいくつかの一般的なもの:
FileNotFoundException extends RuntimeException
<-自明
HTTPException extends RuntimeException
<- 200 以外の結果が検出された場合に http クラスに使用されます
DatabaseQueryException extends LogicException
<- データベース クエリ エラーに使用
具体的に入力することで、コード内のエラーを処理できます。では、HTTP リソースを取得したいとしましょう。404 以外で失敗した場合は、バックアップ URL を試してください。あなたはそれを行うことができます:
try {
return getHttp($url1):
} catch (HttpException $e) {
if ($e->getCode() != 404) {
try {
return getHttp($url2);
} catch (HttpException $e2) {
//It's ok to ignore this, since why know it's an HTTP error and not something worse
return false;
}
} else {
return false;
}
}
あなたが投稿したサンプルコードに関する限り、私はいくつかのことを変更します:
よりセマンティックな意味を持つため、スローされた例外を に変更しますInvalidArgumentException
(生の例外をスローすることはほとんどありません)。
絶対に避けようとする必要catch(Exception $e)
があります。どの例外がスローされたのかわからないので、どうすればそれを処理できますか?
処理方法を知っていると合理的に確信している例外のみをキャッチします (エラーの出力/ログは処理されず、例外の有用性が失われます)。netiher が実際に例外 を処理しているため、 orのようなものは表示されません。catch($e) { logerror($e); }
catch($e) { print $e->getMessage(); }
catch ブロックで例外の原因を修正または回避しない場合は、例外を再スローする必要があります。スタック内のあなたの上にあるコードがそれを処理しようとします。これは、あらゆる場所で再利用されるライブラリとクラスに特に当てはまります。
現在、ユーザー インターフェイスでは、例外をキャッチしてユーザーにエラー メッセージを表示することが許容される場合があります。したがって、例外のメッセージを出力する例は問題ないかもしれませんが、そのユースケースについて本当に考える必要があります。モデルまたはコントローラーから呼び出していますか? その場合は、エラー メッセージを表示しても問題ない可能性があります。ライブラリから呼び出していますか?もしそうなら、おそらく例外をバブルアップさせたほうがよいでしょう。
try{} catch() {}
また、グローバルブロックを使用しないでください。代わりに、例外ハンドラをインストールして処理してください。それはよりクリーンで、より意味的に正しいです (anyは、キャッチした例外の処理方法try{}catch{}
を知っていることを意味するためです。一方、例外ハンドラーは、処理方法を知らなかったために処理されなかった例外を正確に意味します。
例外は例外的な状況のためのものです。すべてのエラー条件に使用しないでください。ユーザーが短すぎるパスワードを送信した場合、例外をスローせず、検証で処理します。しかし、ハッシュ関数が利用可能であることを期待sha256
しているのに利用できない場合、それは例外です。例外は、プログラム エラー (関数への無効な入力など、予期しない状況が発生した場合)、状態エラー (要求されたビューが存在しない場合など、アプリケーションが不明または不安定な状態になった場合) に役立ちます。実行時エラー (ファイルが見つからないエラーなど、実行時にのみ検出できるエラーがアプリケーションで発生した場合)。