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

时间:2014-11-26 11:58:18

标签: c# .net exception-handling nlog

我希望简化我当前的日志记录解决方案并扩展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的责任。

1 个答案:

答案 0 :(得分:1)

只抓住一次。调用堆栈的距离无关紧要:堆栈跟踪将是准确的。当你抓住并重新抛出并再次捕获Stack Trace变化时。

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