我有一个查询处理程序装饰器,它记录任何异常:
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
。
如何重新抛出作为原始类型捕获的异常?
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
您可以使用throw;
代替throw new...
代替throw ex;
一旦抛出异常,它携带的部分信息就是 堆栈跟踪。堆栈跟踪是方法调用层次结构的列表 从以抛出异常并以...结尾的方法开始 捕获异常的方法。如果重新抛出异常 在throw语句中指定异常,堆栈跟踪是 在当前方法和之间的方法调用列表中重新启动 抛出异常的原始方法和当前方法是 丢失。要保留原始堆栈跟踪信息,例外, 使用throw语句而不指定异常。
更多信息:MSDN