我想简化我当前的日志记录解决方案并扩展 NLog
,这样我就可以只记录一次异常,而不用像我当前的那样检查它是否已经在每个捕获中记录解决方案:
catch(Exception ex)
{
if (!ex.IsLogged())
{
logger.Error(ex);
ex.MarkAsLogged();
}
throw;
}
static bool IsLogged(this Exception ex)
{
return ex.Data.ContainsKey("Logged");
}
static void MarkAsLogged(this Exception ex)
{
if (!ex.IsLogged())
{
ex.Data["Logged"] = true;
}
}
我能否以某种方式扩展 NLog
,以便 Error
方法在内部检查异常是否已标记为已记录?
编辑:
我想出的最短的解决方案是这个:
public static Exception IfNotLogged(this Exception ex, Action logAction)
{
if (ex.IsMarkedAsLogged() == true)
{
return ex;
}
logAction();
ex.MarkAsLogged();
return ex;
}
用法:
ex.IfNotLogged(() => logger.Error(ex));
...但它在 C++/CLI
中仍然不起作用,并且必须键入 :-) 到处重复相同的代码并不是我被教导的好习惯,所以我会而是将此责任委托(delegate)给 NLog
。
最佳答案
只抓一次。调用堆栈有多远并不重要:堆栈跟踪将是准确的。当您捕获并重新抛出并再次捕获时,Stack Trace 就会发生变化。
捕获一次,记录它,尽可能地处理它,然后不要再抛出它,继续。
关于c# - 如何将异常标记为已记录(并且只记录一次)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27148612/