ここには 2 つの疑問が隠されていると思います: a) 例外をいつ別の例外の背後に隠す必要があるか。b) これに対していつカスタム例外を使用する必要があるか。
a) 私が言いたいのは、例外がアプリケーション内の 2 つのレイヤーの境界を越えて移動するときはいつでも、新しいレイヤーにより適切な例外の背後に隠されるべきであるということです。例: リモート処理を行っているため、ConnectionWhatEverException が発生します。
しかし、発信者は接続の問題を認識すべきではありません。彼は何らかのサービスを実行したいだけなので、ServiceOutOfOrderException を取得します。この理由は次のとおりです。レイヤー内でリモーティングを行う場合、ConnectionException を使用して何か便利なことを行う必要がある場合があります (再試行、バックアウト キューへの書き込みなど)。そのレイヤーを離れると、誰も ConnectionException の処理方法を知りません。ただし、サービスが機能しない場合にどうするかを決定できる必要があります。
b) 一致する既存の例外がない場合。たとえば、Java には便利な例外がいくつかあります。IllegalState と IllegalArgument をよく使用します。新しい例外クラスの強力な議論は、提供する有用なコンテキストがあるかどうかです。たとえば、失敗したサービスの名前は、ServiceFailedException の引数になる可能性があります。メソッド呼び出しごとにクラスを作成しないでください。100 例外クラスは、動作が異なる (つまり、少なくともフィールドが異なる) 限り、問題にはなりません。名前のみが異なり、同じ抽象化レベルに存在する場合は、それらを 1 つの Exception にして、異なる名前をメッセージまたはその例外クラスの 1 つのフィールドに入れます。
c) 少なくとも Java では、チェック例外に関する議論があります。私はチェックされた種類が嫌いなので、それらをチェックされていないものに直接ラップします。しかし、それはアドバイスよりも意見です。