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?)

这是记录这些详细信息的最佳或可接受的方式吗?我最初的想法是我应该实现一个 ExceptionFormatter 但这似乎要简单得多。

4

2 回答 2

2

使用Exception.Data。您可以在第一次捕获异常时收集要记录的任何额外详细信息,并将它们添加到 Exception.Data 中。您还可以添加不属于原始异常的其他信息,例如 Url、http 标头...

然后,您的异常记录代码可以获取 Exception.Data 并将所有这些信息添加到日志中。

以这种方式处理异常时,您不需要包装异常,也不需要丢失任何调用堆栈。用于throw重新抛出原始异常,在堆栈的更深处再次捕获它,向其添加更多上下文.Data,依此类推,直到您到达异常处理程序。

于 2011-11-27T07:08:41.240 回答
1

我认为您是对的:anExceptionFormatter可能是更好的方法。

我会使用扩展属性来添加您的详细信息。我不认为它比处理程序更复杂。

例如:

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 回答