編集:元の回答は、他の質問でここに移動しました:
https://stackoverflow.com/a/16172074/82609
私の答えを質問の範囲にとどめるために、ここに興味深い部分があります:
例外コードを避ける
例外タイプは、フロー制御の決定に十分なはずです。例外の解析やフロー制御は、役に立たないコードを作成するだけです。例外コードがある限り、例外タイプを追加します。
項目 39: 例外は例外的な条件にのみ使用する (Jochua Bloch の「Effective Java」の章) :
項目 39: 例外は、例外的な状況に対してのみ使用します。つまり、最初に Iterator.hasNext() をチェックする代わりに、Iterator.next() を呼び出すときに NoSuchElementException をキャッチするなど、制御フローに例外を使用しないでください。
関数型言語では、本当に例外的な条件に対してのみ例外を使用する傾向があります。例外的な条件は、「データベースに接続できない」などであり、「ユーザーが入力テキストで希望する商品の数量を提供しなかった」などではありません。これは例外ではなく、業務上のエラーです。
Java 言語はそれほど役に立ちませんが、理想的には、AddProductToBasketWithoutQuantityException を作成する代わりに、関数の出力 (たとえば、EnumAddBasketError のインスタンス) としてそのビジネス エラーを返すことができます。実際には、人々は例外を発生させ、通常の制御フローを壊し、アプリケーションを遅くする傾向があります (例外にはコストがかかります)。
チェック例外を避ける
ここで私の他の回答を読んでください: https://stackoverflow.com/a/16172074/82609
チェックされた例外は、回復可能な障害用です (Sun の推奨事項)。非チェック例外は、回復不能な障害の処理がより簡単です。
結局のところ、これらすべての例外はおそらく必要ないということです。それらのほとんどはおそらく回復不能であるか、例外的ではない可能性があるからです。