それは通常、簡単な質問に要約されます。
この関数は「正当に」失敗する可能性がありますか、それとも失敗は何かが本当に間違っていることの兆候ですか?
関数が特定の種類の入力を予期し、別の種類の入力で呼び出されてはならない場合、正しい入力を提供できないとエラーになりますInvalidArgumentException
。これは、ユーザー入力を直接処理しない関数に特に当てはまります。これは、型ヒントを使用するとさらにうまく機能します。
正しい入力が与えられた場合、関数が常に特定の結果を生成する必要がある場合、その結果を生成できない関数の失敗は、RuntimeException
またはLogicException
その他の種類の例外です。
関数が何らかの結果を生成する場合と生成しない場合false
は、正当な戻り値です。ユーザー入力を処理するため、非常に任意の入力値を取得する関数は、多くの場合、 を返しても問題ありませんfalse
。
いくつかの例:
getDatabaseConnection()
RuntimeException
データベースへの接続を確立できない場合は、または同様のものをスローすることは完全に正しいです。これは、作業を続行できない例外的な状況です。
transformFooIntoBar(Foo $foo)
Bar
何らかの理由でインスタンスを返すことができない場合、何らかの形の例外をスローすることは正しいです。関数には明確な目的と、型チェックされた入力値があります。そのような明確な状況下で機能しない場合は、明らかに何かが間違っており、修正する必要があります。したがって、例外です。
checkIfUserExists($id)
false
その仕事は親指を立てるか親指を下げることであるため、 を返す可能性があります。この職務内容を考えると、ユーザーが存在しないことは例外的な状況ではありません。
スローされた例外をキャッチする場所は、どこで処理するかによって異なります。データベースがダウンしている場合はおそらく何もできないため、データベース接続エラーはコール スタックの最上部でキャッチされるはずです。
一方、一部のモジュールが一部のサブモジュールを呼び出しており、半分がそのサブモジュールが失敗することを期待している場合、および/または失敗した場合の緊急時対応計画がある場合、モジュールはサブモジュールの例外をキャッチし、その仕事を続けます。たとえばgetRSSUpdates()
、 への呼び出しを行いますHTTP::fetchContents($url)
。URL が 404 を返す場合、HTTP
このような状況ではコンテンツを返すことができないため、モジュールは例外をスローする可能性があります。ただし、関数はこれgetRSSUpdates()
に備えており、このケースを「現時点では更新なし」として処理します。