C# - 创建新的异常而不丢失堆栈跟踪和内部异常?
问题描述:
我有一个方法提供了一个Exception对象,我想记录一个错误,如果在错误处理程序本身发生任何事情。下面是一些伪代码:C# - 创建新的异常而不丢失堆栈跟踪和内部异常?
public override void OnError(Exception originalException)
{
try
{
// Do work...
}
catch (Exception e)
{
// How do I create this exception without losing the stack
// trace of e and preserving any inner exceptions that were
// in e at the same time including the details of
// originalException?
Exception newException = new Exception(e.Message, originalException);
Logger.Error("An error occurred", newException);
}
}
基本上,我试图originalException和e以上组合到一个异常消息传递给一个记录器对象。我想一个选择是创建2个单独的日志消息,但它不是理想的。
答
你可以使用一个AggregateException包多个异常:
public override void OnError(Exception originalException)
{
try
{
// Do work...
}
catch (Exception e)
{
var exs = new AggregateException(originalException, e);
Logger.Error("An error occurred", exs);
}
}
编辑:如果Logger
不记录InnerException
属性(或InnerExceptions
在这种情况下)的内容,则似乎是唯一的选择就是多次调用Logger.Error
。
那么你为什么不采取原来的例外只......?那么不需要再创建一个新的异常。 – User2012384
我也想记录错误过滤器本身发生了什么。 – Andrew
'originalException'可通过'newException'的'InnerException'属性访问 - 你可以看看InnerException的堆栈跟踪。否则,你唯一的选择是重新抛出原始异常:'try {...} catch(ex){Logger.Error(ex);扔; }' – Serguei