2015-11-04 102 views
1

我有一个方法提供了一个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个单独的日志消息,但它不是理想的。

+0

那么你为什么不采取原来的例外只......?那么不需要再创建一个新的异常。 – User2012384

+0

我也想记录错误过滤器本身发生了什么。 – Andrew

+0

'originalException'可通过'newException'的'InnerException'属性访问 - 你可以看看InnerException的堆栈跟踪。否则,你唯一的选择是重新抛出原始异常:'try {...} catch(ex){Logger.Error(ex);扔; }' – Serguei

回答

0

你可以使用一个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

相关问题