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:之前的副本更适合,因为它问的问题完全相同。这个新的副本更宽,是这样吗?好的,我会修改答案。