.NET の Exception または ApplicationException からカスタム例外を派生する必要がありますか?
質問
.NET ソリューションで例外クラスを作成する場合のベスト プラクティスは次のとおりです。から派生する System.Exception
またはから System.ApplicationException
?
解決
Jeffery Richter 氏は、『フレームワーク設計ガイドライン』の本の中で次のように述べています。
System.ApplicationException
は、.NET Framework の一部であってはいけないクラスです。
これは、アプリケーションの例外「すべて」をキャッチできる可能性があるという点で何らかの意味を持つことを意図していましたが、パターンに従っていないため、価値がありません。
他のヒント
カスタム例外を次から導出する必要があります。 System.Exception
.
今ではMSDNでも無視するように言っています ApplicationException
:
独自の例外を作成する必要があるアプリケーションを設計している場合は、例外クラスからカスタム例外を導き出すことをお勧めします。もともとは、カスタム例外はApplicationExceptionクラスから派生する必要があると考えられていました。ただし、実際には、これは大きな価値を追加することはわかっていません。詳細については、参照してください 例外処理のベストプラクティス.
http://msdn.microsoft.com/en-us/library/system.applicationException.aspx
ApplicationException
役に立たないと考えられている に対する強力かつ批判的な議論である ApplicationException
.
結果:使わないでください。由来 Exception
.
フレームワークの作成者自身も、ApplicationException には価値がないと考えています。
http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx
ここで素晴らしいフォローアップがあります:
http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx
迷ったときは、私は彼らの著書「フレームワーク設計ガイドライン」に従います。
http://www.amazon.com/Framework-Design-ガイドライン-Conventions-Development/dp/0321246756
ブログ投稿のトピックについては、そこでさらに詳しく説明されています。
RP
私はよくやっています:
private void buttonFoo_Click()
{
try
{
foo();
}
catch(ApplicationException ex)
{
Log.UserWarning(ex);
MessageVox.Show(ex.Message);
}
catch(Exception ex)
{
Log.CodeError(ex);
MessageBox.Show("Internal error.");
}
}
以下の違いを実現できます。
- C# コードのシステム エラーを修復する必要があります。
- 「通常の」ユーザーエラーであり、私が修正する必要はありません。
ApplicationException の使用はお勧めできないことはわかっていますが、次のようなものがあるため、うまく機能します。 クラスが非常に少ない ApplicationException パターンを尊重しません。