gpt4 book ai didi

c# - 如何将异常标记为已记录(并且只记录一次)?

转载 作者:行者123 更新时间:2023-12-05 05:26:13 26 4
gpt4 key购买 nike

我想简化我当前的日志记录解决方案并扩展 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com