読者です 読者をやめる 読者になる 読者になる

プログラマーな日々

プログラマーをやっています。好きなツール:WorkFlowy、好きな言語:C#、好きなサービス:Backlog、好きなAWS:AWS Lambda。

SystemExceptionとApplicationExceptionは無用の長物

System.Exceptionから派生している例外クラスに、System.SystemExceptionとSystem.ApplicationExceptionがあります。

MSの当初の構想では以下のような例外処理が実装可能になるはずでした。

try {

} catch (System.SystemException ex) {
    // CLRからスローされた例外の処理
} catch (System.ApplicationException ex) {
    // アプリケーションからスローされた例外の処理
}

SystemException クラス (System)
System 名前空間内の定義済み例外の基本クラスを定義します。

引用:

このクラスは、システムで定義された例外とアプリケーションで定義された例外を区別する方法として提供されます。

ですが、この構想は完全に破綻しています。少し長くなりますが書籍「プログラミング.NET Framework」P.469から引用します。

CLRがスローする例外なのにApplicationExceptionから派生するもの(TargetInvocationException)が存在したり、アプリケーションがスローするのにSystemExceptionから派生するもの(FormatException)が存在したりしています。完全に混乱していて、結果としてにSystemExceptionとApplicationExceptionにはまったく何の意味もありません。ここに至って、Microsoftはこれらを例外の階層から削除したいとも考えましたが、これら2種類の例外を参照しているコードが動作しなくなるので、それもできません。

というわけで、例外クラスをSystemExceptionやApplicationExceptionから派生させることは意味がないので、今後はやめましょう。

ただし、継承階層が1段深くなるだけで実害はないので、既に実装済みのコードを修正する必要はありません。