前者は後者を簡単に包含することができるため、開発者の効率を促進するシステムアーキテクチャは、実行の効率を促進するシステムアーキテクチャよりもはるかに優れていると私は主張します。1 つのモジュールを変更するために複数のモジュールを開いて変更する必要がある場合、設計は開発者の効率を向上させません。私の非常にお気に入りのプログラミングの本では、例外の種類は例外ハンドラーによって動機付けられることを推奨しています。次のようなもの:
Version 1:
void tryToDoSomething(bool arg) {
try {
doSomething(arg); //Throws MyException
} catch (MyException e) {
if (e.errorMessage == "Try a different argument")
tryToDoSomething(!arg);
else if (e.errorMessage == "Try again")
tryToDoSomething(arg);
}
}
Version 2:
//Split the exception so that it can be handled differently
void tryToDoSomething(bool arg) {
try {
doSomething(arg); //Throws InvalidArgumentException, NotReadyException
} catch (InvalidArgumentException e) {
tryToDoSomething(!arg);
} catch (NotReadyException e) {
tryToDoSomething(arg);
}
}
最新のコンパイラは、自己文書化に加えて、バージョン 2 を大幅に高速化するためにスローを最適化できます。これが実際に例外が作成された理由です。これは、手動で渡してチェックする必要があった以前の鈍いエラー コードを置き換えるためにコンパイラが理解できるユーザー定義型としてです。
とにかく、エラーコードがユーザーに届くように設計されている場合、それらは例外ではなくエラーであり、そのようにスローされるべきであると主張します. おそらく、文字列エラー コードを受け取り、正しい派生型をスローする ErrorFactory のようなものを設計するか、直接スローすることができます。一方、エラー コードがユーザーに届かない場合、わざわざ使用する必要はありません。