このような質問には「正しい」回答はありません。さまざまな哲学があり、どちらがあなたやあなたの文脈に最も合っているかを判断しなければなりません。あなたは、このような機能に必須の引数として、深刻なプログラミングのミスが見つからないか、誤ったタイプです検出した場合、私はちょうど例外をスローし、例外に綴ることを好む、
:ここ
は私の一般的なスキームですmsgは何が間違っていますか。これは、このコードが初めて実行されたときに開発者に見られるようになり、コードを直ちに修正する必要があることがわかっているはずです。ここでの一般的なアイデアは、開発者にエラーを直ちに表示させ、例外をスローするのが通常最も速い方法であり、例外に有用なメッセージを入れることができるということです。
プログラミングミスではなく、特定の操作(おそらくユーザーデータを含む)の理由を示す「ユーザー名が既に使用されている」または「ユーザー名に無効な文字が含まれている」などのエラー戻り値が予想される場合完了していなければ、この情報を呼び出し元に伝える関数から戻り値を作成します。
関数が結果またはエラーのいずれかを返す必要がある場合は、成功したものとは別のものとして簡単に検出できる一連のエラー値を思いつくことが容易であれば、ケースバイケースで決定する必要があります戻り値。たとえば、Array.prototype.indexOf()
は、値が見つからなかったことを示す負の値、またはインデックスを返すことを示す正の数を返します。これらの範囲は完全に独立しているため、それらを区別するためのテストをコーディングするのは簡単です。
例外をスローする別の理由は、エラーを伝播するコードを手動で記述するのではなく、例外をいくつかの呼び出しレベルまたはブロックレベルに伝播させる方が簡単な場合にコードを使用する可能性が高いことです。これは両刃の剣です。例外を伝播させることは非常に便利ですが、エラー状態(解放リソースなど)で適切にクリーンアップするためには、各レベルの例外について知り、対処する必要があることがありますとにかく自動的にレベルを上げることができます。
関数のコードまたはそれを呼び出す開発者がこのような区別をするのは簡単ではない場合は、複数のプロパティを持つオブジェクトを返すのが適切な場合があります。エラープロパティー、もう1つは値です。機能だけでブール値を返し、値またはオペレータが無効な日付の例外をスローする場合、それは確かに便利だろう
function dateCompare(date1,operator,date2)
と
if (dateCompare(date1,'eq',date2) || dateCompare(date3,'l3',date4))
:あなたの特定のケースで
。これが良いデザインの決定であるかどうかは、これがどのように使用されるかに少し依存します。あなたがタイトなループで、たくさんの値で実行していると、その多くはフォーマットが悪く、そのような例外がスローされ、この場合パフォーマンスが重要な場合は、上記のオブジェクトを返すほうがよいかもしれません。呼び出しコードの記述方法を変更します。
しかし、フォーマットの失敗が通常の予想されたケースでない場合、または一度しか実行していない場合や、例外と戻り値のパフォーマンスの違いが気付かれない場合(通常はそうです)例外をスローします。これは、関数の予想されるユースケースを汚染することなく無効な入力を処理するきれいな方法です。
How can we handle it so that it is easy to use as well as not very expensive?
正常に入力されていない場合は、入力が悪いと例外がスローされることはありません。さらに、このコードが何らかのタイトループで何度も呼び出されない限り、戻り値とスローされた/キャッチされた例外との違いに気づくことはありません。だから、予期しないケースに対して例外をコード化して使用するために、予想されるケースをよりシンプルにするようにコードすることをお勧めします。その後、あなたの予想されるコードパスは例外ルートにはなりません。言い換えれば、例外は実際には正常に対する「例外」です。
Under what circumstances throwing exceptions will be more appropriate even if it is too expensive?
上記の説明を参照してください。
ありがとうございます。それは非常に明確です。 – krrish