Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何记录异常并将其作为实际类型重新刷新_C# - Fatal编程技术网

C# 如何记录异常并将其作为实际类型重新刷新

C# 如何记录异常并将其作为实际类型重新刷新,c#,C#,我有一个查询处理程序装饰器,它记录任何异常: public class QueryHandlerLogDecorator<TQuery, TResult> : IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult> { private readonly IQueryHandler<TQuery, TResult> _handler; private read

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

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);
        }
    }
}
公共类QueryHandlerLogDecorator:IQueryHandler
问:伊奎里在哪里
{
专用只读IQueryHandler\u处理程序;
专用只读ILog_日志;
公共查询handlerlogdecorator(IQueryHandler处理程序)
{
_handler=handler;
_log=LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
}
公共TResult句柄(TQuery查询)
{
尝试
{
var result=\u handler.Handle(查询);
_日志信息(“确定”);
返回结果;
}
捕获(例外情况除外)
{
_日志错误(例如消息,例如);
抛出新异常(例如消息);
}
}
}
虽然异常处理并不是世界上最糟糕的事情,但它意味着我丢失了抛出的异常类型

例如,如果我在应用程序的下方抛出
ApplicationException
,这将被捕获并作为
Exception
重新抛出


如何将捕获到的异常作为原始类型重新播放?

仅使用
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;
    }
}

您可以使用
throw而不是
抛出新…
或代替
抛出ex

一旦抛出异常,它携带的部分信息就是 堆栈跟踪。堆栈跟踪是方法调用层次结构的列表 这从抛出异常的方法开始,以 捕获异常的方法。如果 在throw语句中指定异常时,堆栈跟踪为 在当前方法和之间的方法调用列表处重新启动 引发异常的原始方法和当前方法是 迷路的要将原始堆栈跟踪信息保留为异常, 使用throw语句而不指定异常


更多信息:

只需“扔”就足够了…@CodeGray:之前的副本更适合,因为它问的问题完全相同。这个新的副本更宽,是这样吗?好的,我会修改答案。