web-dev-qa-db-ja.com

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

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

私はGoogleをチェックしましたが、多数の推奨事項がありますが、どれがより信頼性があるかはわかりません。

信頼できる記事へのリンクがあれば、それも役立ちます。

63
Darren Young

カスタム例外を作成するための標準は、 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をより高いレベルで処理するのはあなた次第です(該当する場合)

カスタム例外の設計 および カスタム例外 もご覧ください

67
James

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

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

9
Michael Maddox

例外処理のプラクティスを探していると思います。次の記事をご覧ください。

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 //

8
paragy

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

たとえば、引数をチェックするために「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) {}
}

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

グレッグ

1
Greg Gum