我应该如何在webexception, soap exception等中记录额外的细节?

本文关键字:记录 细节 exception webexception soap 我应该 | 更新日期: 2023-09-27 18:05:40

在企业库中,我没有将足够的细节放入日志中,所以我开始编写这个处理程序来提取特定于异常的属性并将它们添加到消息字符串中:

[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,但这似乎简单得多。

我应该如何在webexception, soap exception等中记录额外的细节?

使用Exception.Data。您可以在首次捕获异常时收集想要记录的任何额外细节,并将它们添加到exception . data中。您还可以添加其他信息,不是原始异常的一部分,如Url, http头,…

你的异常日志代码可以拾取exception。数据并将所有这些信息添加到日志中。

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

我认为你是对的:一个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);
        } 
    }
}