74

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

私はグーグルをチェックしました、そしてたくさんの推薦があります、しかし私はどれがより信頼性を持っているかわかりません。

誰かが権威ある記事へのリンクを持っているなら、それも役に立ちます。

4

4 に答える 4

68

カスタム例外を作成するための標準は、 Exceptionから派生することです。次に、独自のプロパティ/メソッドとオーバーロードされたコンストラクター(該当する場合)を導入できます。

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その後、より高いレベルで処理するのはあなた次第です(該当する場合)

カスタム例外とカスタム例外の設計もご覧ください。

于 2011-01-25T10:09:48.877 に答える
13

カスタム例外を作成するコードは次のとおりです。

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

于 2012-08-14T15:20:18.700 に答える
8

私はあなたが例外処理の慣行を探していると思います。だから、次の記事を見てください、

http://msdn.microsoft.com/en-us/library/ms229014.aspx//カスタム例外を含む例外に関する全体的なアイデアを提供します

http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx //

于 2011-01-25T09:48:10.430 に答える
1

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

たとえば、「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) {}
}

これは非常に簡単で、どのエラーロガーでも機能します。これを見ると、ナビゲーションの問題であることがわかり、必要に応じて詳細を表示できます。

グレッグ

于 2013-08-07T19:12:35.020 に答える