11

うまくいかない可能性のある非常に特定の問題に対して、カスタム例外を作成しました。別のシステムからデータを受け取り、そのデータを解析しようとしているときに爆弾が発生した場合は例外を発生させます。カスタム例外では、「ResponseData」というフィールドを追加したので、コードで処理できなかったものを正確に追跡できます。

このようなカスタム例外では、その余分な応答データを例外「メッセージ」に入れる必要がありますか?そこに行けば、メッセージは巨大になる可能性があります。Elmahを使用しているので、そこに欲しいと思います。そうすることで、そのデータを取得できます。

したがって、問題は次のいずれかです。-カスタム例外のフィールドから追加情報をElmahに記録させるにはどうすればよいですか?-追加の例外の詳細を「message」プロパティに入力する必要がありますか?

4

6 に答える 6

12

このようなカスタム例外では、余分な応答データを例外「メッセージ」に入れる必要がありますか?

いいえ、セーレンがすでに指摘したように。ただし、例外の種類は、ToStringそこに応答データ情報をオーバーライドして適切に追加することができます。これは、BCL (Base Class Library) の多くの例外タイプが後に続く完全に通常のプラクティスであるため、流れに逆らうことはありません。たとえば、SSCLI (Rotor)のSystem.IO.FileNotFoundException.ToString実装を見てください。

public override String ToString()
{
    String s = GetType().FullName + ": " + Message;

    if (_fileName != null && _fileName.Length != 0)
        s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName);

    if (InnerException != null)
        s = s + " ---> " + InnerException.ToString();

    if (StackTrace != null)
        s += Environment.NewLine + StackTrace;

    try
    {
        if(FusionLog!=null)
        {
            if (s==null)
                s=" ";
            s+=Environment.NewLine;
            s+=Environment.NewLine;
            s+="Fusion log follows: ";
            s+=Environment.NewLine;
            s+=FusionLog;
        }
    }
    catch(SecurityException)
    {

    }
    return s;
}

ご覧のとおり、 FusionLogプロパティのコンテンツを追加します。これは、アセンブリの読み込みに失敗した場合の追加情報を表します。

Elmah にカスタム例外のフィールドから追加情報を記録させるにはどうすればよいですか

ELMAHは、例外を呼び出した結果をエラーの詳細として保存するので、規定どおりに実装してToStringいれば、それ以上の作業を行わなくても情報がログに記録されます。ToString唯一の問題は、ログに記録される詳細が構造化されていないテキストになることです。

于 2008-09-30T23:43:45.000 に答える
6

.Messageデバッグ情報を入力するのではなく、簡潔で役立つテキストを入力する必要があります。

http://msdn.microsoft.com/en-us/library/system.exception.message.aspx

メッセージのテキストは、エラーを完全に説明し、可能であれば、エラーを修正する方法を説明する必要があります。Messageプロパティの値は、ToStringによって返される情報に含まれています。

Messageプロパティは、例外を作成するときにのみ設定されます。現在のインスタンスのコンストラクターにメッセージが提供されなかった場合、システムは現在のシステムカルチャを使用してフォーマットされたデフォルトのメッセージを提供します。

[..]

相続人へのメモ:

Messageプロパティは、メッセージの内容または形式の制御を必要とするクラスでオーバーライドされます。アプリケーションコードは通常、キャッチされた例外に関する情報を表示する必要がある場合にこのプロパティにアクセスします。

エラーメッセージはローカライズする必要があります。

応答データは説明としての資格がありません。

elmahに慣れていないので、Exception使用中にクラスを拡張する方法を説明できません。elmahは独自のサブクラスを実装していExceptionますか?またはインターフェイス?自分でサブクラス化できますか?

于 2008-09-07T21:14:13.967 に答える
5

Exception クラスには、カスタム データを通常の例外に関連付けるために使用できるディクショナリ (Data という名前だと思います) が含まれています。

于 2008-09-30T23:59:39.953 に答える
1

質問を完全には理解していませんが、追加の例外データをどうするかを尋ねているようです。それがあなたの質問でない場合は、これを無視してください。

重要な質問は、例外メッセージが正確に何であるかということです。例外がどこから来たのかを知るためではなく、スタック トレースはそのためのものです。例外をより一般的なものにカプセル化することではなく、InnerException フィールドで行う必要があります。例外がコードの特定の場所からのみ発生する場合、発生したエラーの種類を説明することすらできません-それが例外のタイプです。

通常、私はメッセージ フィールドを使用して、私ではないプログラマーがこのエラーを初めて見たときに、基になるシステムを理解するために使用できる、人間が読める簡単なヒントを提供します。メッセージ フィールドは、短い (一文の) 説明、このエラーがどのように頻繁に発生するかについてのヒント、またはさらに読むための参照に適していると思います。

したがって、私があなたの質問を理解している限り、別のシステムから受け取ったこの「追加情報」を保存する最良の方法は、InnerException としてだと思います。Elmah についてはわかりませんが、その価値がある場合は、InnerExceptions をチェックして保存します。

于 2008-09-07T21:21:59.767 に答える
0

質問がわかりません。System.Exceptionを拡張していて、すでにElmahフィールドを追加しています。それが属する場所です-例外自体のパブリックプロパティとして。

于 2008-09-07T21:03:26.753 に答える
0

Elmah は、未処理の例外を記録する http モジュールです。

カスタムフィールドを保存しないので、Elmah の制限にすぎないと思います。あの人たちに聞いてみようと思います。応答データ用に余分なフィールドがありますが、Elmah はそれを保存しません。

于 2008-09-07T21:22:59.687 に答える