2016-07-11 22 views
-2

我有一个查询处理装饰它记录任何异常:如何记录异常,并重新抛出的实际类型

public class QueryHandlerLogDecorator<TQuery, TResult> : IQueryHandler<TQuery, TResult> 
    where TQuery : IQuery<TResult> 
{ 
    private readonly IQueryHandler<TQuery, TResult> _handler; 
    private readonly ILog _log; 

    public QueryHandlerLogDecorator(IQueryHandler<TQuery, TResult> handler) 
    { 
     _handler = handler; 
     _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
    } 

    public TResult Handle(TQuery query) 
    { 
     try 
     { 
      var result = _handler.Handle(query); 

      _log.Info("Ok"); 

      return result; 
     } 
     catch (Exception ex) 
     { 
      _log.Error(ex.Message, ex);     

      throw new Exception(ex.Message); 
     } 
    } 
} 

虽然异常处理是不是世界上最糟糕的事情,它的意思是我失去了抛出异常的类型。

例如,如果我在应用程序中将ApplicationException降低,则会捕获并重新排列为Exception

如何重新抛出被捕获的异常作为原始类型?

+3

只是 “扔”;已经足够... –

+0

@CodeGray:以前的重复是一个更好的适合,因为它完全问了同样的问题。这个新的副本更广泛。 –

回答

0

您可以只使用throw;代替throw new...或代替throw ex;

一旦抛出一个异常,它承载的信息的一部分是 堆栈跟踪。堆栈跟踪是方法调用层次结构 的列表,该列表以抛出异常的方法开始,并以捕获该异常的方法结束于 。如果一个异常被 重新抛出,在throw语句中指定异常,则堆栈跟踪 在当前方法重新启动,并且方法调用列表 之间抛出异常的原始方法和当前方法丢失 。为了保持原始堆栈跟踪信息的例外, 使用throw语句而不指定异常。

这里更多:MSDN

0

只需使用throw关键字即可重新发现异常。这将重新抛出传递给异常处理程序的异常。

public TResult Handle(TQuery query) 
{ 
    try 
    { 
     var result = _handler.Handle(query); 

     _log.Info("Ok"); 

     return result; 
    } 
    catch (Exception ex) 
    { 
     _log.Error(ex.Message, ex);     
     throw; 
    } 
} 
+0

是这样吗?好的,我会修改答案。 –