InvalidArgumentExceptionとUnexpectedValueExceptionはいつ使用する必要がありますか? 私には同じように見えます。
1 つは LogicException を拡張し、もう 1 つは RuntimeException を拡張することに注意してください。そのため、違いはそれほど微妙な IMO ではないはずです。
InvalidArgumentExceptionとUnexpectedValueExceptionはいつ使用する必要がありますか? 私には同じように見えます。
1 つは LogicException を拡張し、もう 1 つは RuntimeException を拡張することに注意してください。そのため、違いはそれほど微妙な IMO ではないはずです。
マニュアルページの説明をよく見ると、次のようになります。
引数が期待される型でない場合にスローされる例外。
Exception thrown if an argument does not match with the expected value.
( 2014年半ばまでの記述でしたが、PHP 5.6導入に伴い変更)
値が一連の値と一致しない場合にスローされる例外。通常、これは、関数が別の関数を呼び出し、戻り値が特定の型または value[,] であると予想される場合に発生します。算術またはバッファ関連のエラーは含まれません。
このことから、 は関数に渡された引数の型をチェックInvalidArgumentException
することを目的としており、 はおそらく関数の内部計算中 (他の関数から返された値など) に値と有効な値セットを検証することを目的としていると結論付けることができます。UnexpectedValueException
引数の値をチェックすることは、ここでは一種の灰色の領域であることに注意してください。範囲外の入力値の場合に例外をスローすることは、完全に予期されるInvalidArgumentException extends LogicException
実行時の動作である可能性があるため、このような場合の唯一の候補として( を拡張する ) を残します。should lead directly to a fix in your code.
UnexpectedValueException
RuntimeException
最大の違いは「引数」と「値」だと思います。
私が見る方法InvalidArgumentException
は、(渡された)引数に対してであるのに対しUnexpectedValueException
、(返された)値に適用されます。また、「無効」と「予期しない」の間には微妙ではあるが重要な違いがあります。これは、最初が LogicException で、2 番目が RuntimeException である理由も説明しています。
例: Twitter API を利用する関数があるとします: getLastMessageDate($userid)
: (数値の) ユーザー ID を渡すと、そのユーザーの最後のメッセージの日付が yyyy-mm-dd 文字列として返されます。
ここで、数値ではなく文字列を引数としてこの関数を呼び出すとします。この時点で、指定された引数がこの関数に対して無効であるため、InvalidArgumentException を呼び出すことができます。これらのチェックはロジックによって行うことができます- 変数は数値かそうでないかのどちらかだからです。したがって、これは LogicException です。
ただし、特に (サードパーティの) 動的コンテンツを扱っている場合は、関数の戻り値をロジックで検証できない場合があります。関数が何を返すかを正確に知ることは決してできないからです。(もしそうなら、これは間違いなくあなたの機能を役に立たなくするでしょう。)
そのため、今回は (有効な) ユーザー ID を使用して関数を呼び出すと、関数はそのユーザーの最後のメッセージの日付を取得します。この日付で、フォーマットなどの何かをしたいと思います。
ここで、Twitter の人たちが何か間違ったことをしたと想像してみてください。私が期待していた yyyy-mm-dd 日付文字列の代わりに、空の文字列または「blaaaa」という別の文字列が表示されます。この時点で、私はUnexpectedValueException
.
この値が「無効」であるとは言えません。文字列を要求したところ、文字列を取得しました。しかし、それは私が期待していた「種類の文字列」ではありません。したがって、予期しないValueException です。
これで何かが解決することを願っています。これは私の最初の投稿です。これまでのところ、頭の中にあることを書き留めるのは簡単なことではないことがわかりました (英語は私の母国語でもありません)。
私の理解では、可能な値の範囲の固定リストに対して引数をチェックする場合は、 である を使用する必要がありますInvalidArgumentException
。LogicException
たとえば、ユーザーが入力したデータに数字のみが含まれているかどうかを確認します。プログラムロジックは、これらの値の範囲を処理することが期待できます。
UnexpectedValueException
、RuntimeException
(実行時にのみ検出できるエラー/コンパイル時に検出できないエラー)であるため、予測可能な指定された入力範囲外で発生する例外に使用されます(おそらく、上記の「ロジック」チェック後の最後の手段として)。
この質問に答える鍵はUnexpected...
、UnexpectedValueException
. Unexpected
これは、プログラム ロジックでこの値を処理できないことを意味します。Invalid
一方、この値が処理されたことを示します。