如何记录异常并重新抛出实际类型

时间:2016-07-11 07:05:21

标签: c#

我有一个查询处理程序装饰器,它记录任何异常:

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

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

2 个答案:

答案 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