3

エンタープライズ ライブラリでは、ログに十分な詳細が記録されていなかったので、例外固有のプロパティを取り出してメッセージ文字列に追加するために、このハンドラーを書き始めました。

[ConfigurationElementType(typeof(CustomHandlerData))]
public class ExposeDetailExceptionHandler : IExceptionHandler
{
    public Exception HandleException(Exception exception, Guid handlingInstanceId)
    {
        if (exception is System.Net.WebException) 
            return ExposeDetail((System.Net.WebException)exception);
        if (exception is System.Web.Services.Protocols.SoapException) 
            return ExposeDetail((System.Web.Services.Protocols.SoapException)exception);

        return exception;
    }

    private Exception ExposeDetail(System.Net.WebException Exception)
    {
        string details = "";
        details += "System.Net.WebException: " + Exception.Message + Environment.NewLine;
        details += "Status: " + Exception.Status.ToString() + Environment.NewLine;

        return new Exception(details, Exception);
    }

    private Exception ExposeDetail(System.Web.Services.Protocols.SoapException Exception)
    {
        //etc
    }
}

(余談ですが、ExposeDetail のどのバージョンを実行するかを選択するより良い方法はありますか?)

これは、これらの詳細をログに記録するための最良の方法または受け入れられている方法ですか。

4

2 に答える 2

2

Exception.Dataを使用します。例外が最初にキャッチされた時点でログに記録する追加の詳細を収集し、それらを Exception.Data に追加できます。Url、http ヘッダーなど、元の例外に含まれていなかったその他の情報を追加することもできます。

次に、例外ログ コードで Exception.Data を取得し、そのすべての情報をログに追加できます。

この方法で例外を処理する場合、例外をラップする必要はなく、コール スタックを失う必要もありません。元の例外をthrow再スローし、スタックのさらに上で再度キャッチし、さらにコンテキストを追加.Dataし、例外ハンドラーに到達するまで繰り返します。

于 2011-11-27T07:08:41.240 に答える
1

私はあなたが正しいと思います:ExceptionFormatterおそらくより良い方法です。

拡張プロパティを使用して詳細を追加します。ハンドラーほど複雑ではないと思います。

例えば:

public class AppTextExceptionFormatter : TextExceptionFormatter
{
    public AppTextExceptionFormatter(TextWriter writer, 
             Exception exception, 
             Guid handlingInstanceId)
        : base (writer, exception, handlingInstanceId) 
    {
        if (exception is System.Net.WebException) 
        {
            AdditionalInfo.Add("Status", ((System.Net.WebException)exception).Status.ToString());
        }
        else if (exception is System.Web.Services.Protocols.SoapException)
        {
            AdditionalInfo.Add("Actor", ((SoapException)exception).Actor);
        } 
    }
}
于 2011-09-09T05:55:45.450 に答える