C#-在不丢失堆栈跟踪和内部异常的情况下创建新异常?
我有一个提供异常对象的方法,如果错误处理程序本身发生任何事情,我想记录一个错误。下面是一些伪代码:C#-在不丢失堆栈跟踪和内部异常的情况下创建新异常?,c#,exception,C#,Exception,我有一个提供异常对象的方法,如果错误处理程序本身发生任何事情,我想记录一个错误。下面是一些伪代码: public override void OnError(Exception originalException) { try { // Do work... } catch (Exception e) { // How do I create this exception without losing the stack
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组合成一条异常消息,传递给logger对象。我想一个选项是创建两个单独的日志消息,但这并不理想。您可以使用一个来包装多个异常:
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的多次调用。错误您可以使用包装多个异常:
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
,那么为什么不只记录原始异常。。。??那么就不需要创建新的异常。我还想记录错误筛选器本身中发生的情况。可以通过newException
的InnerException
属性访问originalException
——您可以查看InnerException
的堆栈跟踪。否则,您唯一的选择就是重新抛出原始异常:尝试{…}catch(ex){Logger.Error(ex);throw;}
重新抛出您可以执行的throw代码>您不应该捕获这么多嵌套异常。您的代码应该在可能发生特定(而非一般)异常(如文件IO异常)和您可以处理的点处处理这些异常。然后,如果您想要一个catch-all异常处理程序,请在代码的顶层放置一个异常处理程序。否则,所有这些常规异常处理程序只会导致代码出现错误。那么为什么不只处理原始异常。。。??那么就不需要创建新的异常。我还想记录错误筛选器本身中发生的情况。可以通过newException
的InnerException
属性访问originalException
——您可以查看InnerException
的堆栈跟踪。否则,您唯一的选择就是重新抛出原始异常:尝试{…}catch(ex){Logger.Error(ex);throw;}
重新抛出您可以执行的throw代码>您不应该捕获这么多嵌套异常。您的代码应该在可能发生特定(而非一般)异常(如文件IO异常)和您可以处理的点处处理这些异常。然后,如果您想要一个catch-all异常处理程序,请在代码的顶层放置一个异常处理程序。否则,所有这些常规异常处理程序都会导致代码出现错误。