如何将异常标记为已记录(并且仅记录一次)
本文关键字:记录 一次 记为 异常 | 更新日期: 2023-09-27 18:31:59
我想简化我当前的日志记录解决方案并扩展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
,必须输入:-)到处重复相同的代码并不是一个好习惯,因为我被教导过,所以我宁愿把这个责任推给NLog
。
只捕获一次。调用堆栈向上多远并不重要:堆栈跟踪将是准确的。当您捕获并重新抛出并再次捕获时,堆栈跟踪会发生变化。
抓住它一次,记录它,尽可能处理它,然后不要再扔它,继续。