私の意見では、例外は実行時にコードエラーを検出するための不可欠なツールです。テストと本番の両方で。スタックトレースと組み合わせて、ログから何が発生したかを把握できるように、メッセージを十分に冗長にします。
例外はほとんどが開発ツールであり、予期しない場合に本番から妥当なエラーレポートを取得する方法です。
懸念の分離(予期されるエラーのみに対する一般的なハンドラーに到達するまでのフォールスルーと予期されるエラーのみのハッピーパス)は良いことであり、コードをより読みやすく保守しやすくすることは別として、実際に可能な限りすべてのコードを準備することは不可能です予期しないケース。エラー処理コードで膨らませて読みにくくします。
それは実際には「予期しない」の意味です。
ところで、予想されることとそうでないことは、コールサイトでのみ決定できます。そのため、Javaのチェック例外は機能しませんでした-決定はAPIの開発時に行われますが、何が期待されるかまたは予期しないかがまったく明確ではありません。
簡単な例:ハッシュマップのAPIには2つのメソッドがあります。
Value get(Key)
そして
Option<Value> getOption(key)
最初の例外が見つからない場合は例外をスローし、後者はオプションの値を提供します。後者の方が理にかなっている場合もありますが、コードでは特定のキーに値があることを予期しなければならないため、キーがない場合、基本的な仮定が失敗しました。この場合、実際には、呼び出しが失敗した場合にコードパスから抜け出し、一般的なハンドラーに到達することが望ましい動作です。
コードは、失敗した基本的な仮定に対処しようとしてはなりません。
もちろん、それらをチェックして、読みやすい例外をスローすることを除きます。
例外をスローすることは悪いことではありませんが、例外をキャッチすることは悪いことではありません。予期しないエラーを修正しようとしないでください。ループまたは操作を継続し、ログを記録し、不明なエラーを報告する可能性があるいくつかの場所で例外をキャッチします。
あちこちでブロックをキャッチするのは非常に悪い考えです。
意図を簡単に表現できるようにAPIを設計します。つまり、キーが見つからないなどの特定のケースを予想するかどうかを宣言します。APIのユーザーは、本当に予期しない場合にのみスロー呼び出しを選択できます。
エラー処理の自動化と新しい言語からの懸念のより良い分離のためにこの重要なツールを省略することで人々が例外を嫌い、行き過ぎている理由は悪い経験だと思います。
それと、実際に何が良いのかについての誤解。
モナドバインディングを介してすべてを実行することでそれらをシミュレートすると、コードの可読性と保守性が低下し、スタックトレースがなくなるため、このアプローチはさらに悪化します。
機能的なスタイルのエラー処理は、予想されるエラーの場合に最適です。
例外処理が残りすべてを自動的に処理するようにします。それが目的です:)
panic
まったく同じではないものを無視する場合は、リストにGoを追加できます。それに加えて、例外はGOTO
、明確な理由で誰もそのように呼び出しませんが、例外を実行する洗練された(しかし快適な)方法以上のものではありません。