2011-01-25 8 views
57

C#でカスタム例外を実装するための業界標準のベストプラクティスは何ですか?C#でカスタム例外を実装するための業界標準のベストプラクティスは何ですか?

私はGoogleにチェックしましたが、たくさんのおすすめがありますが、どちらが信頼性が高いのか分かりません。

誰かが信頼できる記事へのリンクを持っている場合は、それも役立ちます。

+1

http://bit.ly/hVTSgpと同様に、あなたが探しているものをさらに説明することでトピックを絞り込むことをお勧めします。 –

+0

私の上司は、私が書いたプログラムのカスタム例外クラスを作成して、特定のエラーを簡単に特定できるようにしたいと考えています。特定のExcelセルにデータがないか、アウトオブレンジ例外(これに対して標準を使用できる)、特定のオーダーでアップロードされていないデータなど –

+7

ビジネスロジックフローを処理するために例外を使用しているようです可能であれば例外を使用せずに問題を処理すべきである。 – cjk

答えて

64

。独自のプロパティ/メソッドとオーバーロードされたコンストラクタ(該当する場合)を導入することができます。

ここには、例外タイプに固有の特別なパラメータを取り込むカスタムConnectionFailedExceptionの基本的な例があります。

[Serializable] 
public class ConnectionFailedException : Exception 
{ 
    public ConnectionFailedException(string message, string connectionString) 
     : base(message) 
    { 
     ConnectionString = connectionString; 
    } 

    public string ConnectionString { get; private set; } 
} 

アプリケーションでは、アプリケーションがデータベースに接続しようとするシナリオで使用できます。

try 
{ 
    ConnectToDb(AConnString); 
} 
catch (Exception ex) 
{ 
    throw new ConnectionFailedException(ex.Message, AConnString); 
} 

それから、より高いレベル(該当する場合)

ConnectionFailedExceptionを処理するのはあなた次第です。またここでDesigning Custom Exceptionsを見て、Custom Exceptions

+2

クールなおかげで@ジェームス...非常に有用 – scarpacci

+0

ConnectionFailedException型の例外を捕まえてみるのはどうですか? –

+0

@Anarこの例は、あなたが 'ConnectionFailedException'をどのように呼び出すかを示しています。一般的な 'Exception'ではなく、' ConnectToDb'から発生したより意味のある例外をキャッチすることができましたが、デモンストレーションの目的にすぎませんでした。 – James

8

は、カスタム例外を作成するためのコードですしています。

using System; 
using System.Runtime.Serialization; 

namespace YourNamespaceHere 
{ 
    [Serializable()] 
    public class YourCustomException : Exception, ISerializable 
    { 
     public YourCustomException() : base() { } 
     public YourCustomException(string message) : base(message) { } 
     public YourCustomException(string message, System.Exception inner) : base(message, inner) { } 
     public YourCustomException(SerializationInfo info, StreamingContext context) : base(info, context) { } 
    } 
} 

も参照してください:http://www.capprime.com/software_development_weblog/2005/06/16/CreatingACustomExceptionClassInC.aspx

+0

FWIW - これは、Visual Studioに含まれている 'Exception'スニペットを使用した場合とほとんど同じです。 –

+0

優れています。私は2005年にブログの記事を書いたが、私はMicrosoftの指針があったと思うが、これは、スニペットを介してVSにコード化されているようだ。 –

0

カスタム例外を使用してエラーの性質を伝えます。

たとえば、引数をチェックするために "ArgumentNullException"が提供されているフレームワークを使用するのが好きです。その後、デバッガまたはエラーログのいずれかでこのエラーが表示されたら、私は直ちにエラーを読むことなくエラーの性質を知ります。

スペクトルのもう片側は、InvalidOperationExceptionです。これは、ほとんど何かを意味する可能性があります。

カスタム例外の代わりに、詳細なエラーメッセージがあります。それは大丈夫ですが、ConnectionFailedなどのカスタム例外を作成する方が意味があります。その後、メッセージ自体がより詳細な情報を提供することができます。

このようなカスタム例外を作成する場合、私は新しいプロパティを追加しません。これは、エラー・ロガーを使用している場合は、すべての例外を処理するためです。特別なプロパティを追加すると、エラーロガーはそれを無視します。たとえば、MSTestを使用する場合、テストを実行し、失敗した場合、カスタムプロパティは表示されません。しかし、ベースクラスのMessageプロパティを使うと、うまく表示されます。

だから、サブクラス化は非常に簡単です:

public class NavigationException : Exception{ 
    public NavigationException() {} 
    public NavigationException(string msg) : base(msg) {} 
    public NavigationException(string msg, Exception inner) : base(msg, inner) {} 
} 

これは、非常に簡単である任意のエラーロガーで動作し、私はそれを見たとき、私はそれはナビゲーションの問題だったし、必要に応じて、私は詳細を表示することができます知っています。

グレッグ

関連する問題