2016-07-11 34 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

是這樣嗎?好的,我會修改答案。 –

相關問題