在企业库中,我没有将足够的细节放入我的日志中,因此我开始编写此处理程序以从特定于异常的属性中取出并将它们添加到消息字符串中:
[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,但这似乎更简单。
答案 0 :(得分:2)
使用Exception.Data。您可以收集要在首次捕获异常时记录的任何额外详细信息,并将它们添加到Exception.Data中。您还可以添加不属于原始异常的其他信息,例如Url,http标头,......
然后,您的异常日志记录代码可以获取Exception.Data并将所有信息添加到日志中。
当你以这种方式处理时,你不需要包装异常,也不需要丢失任何调用堆栈。使用throw
重新抛出原始异常,再次在堆栈中捕获它,向其上的.Data
添加更多上下文,依此类推,直到到达异常处理程序。
答案 1 :(得分:1)
我认为你是对的:ExceptionFormatter
可能是更好的方法。
我会使用扩展属性来添加您的详细信息。我不认为它比处理程序更复杂。
E.g:
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);
}
}
}