如何将异常标记为已记录(并且仅记录一次)

本文关键字:记录 一次 记为 异常 | 更新日期: 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

如何将异常标记为已记录(并且仅记录一次)

只捕获一次。调用堆栈向上多远并不重要:堆栈跟踪将是准确的。当您捕获并重新抛出并再次捕获时,堆栈跟踪会发生变化。

抓住它一次,记录它,尽可能处理它,然后不要再扔它,继续。