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

标签 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 中仍然不起作用,并且必须键入 :-) 到处重复相同的代码并不是我被教导的好习惯,所以我会而是将此责任委托(delegate)给 NLog

最佳答案

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

捕获一次,记录它,尽可能地处理它,然后不要再抛出它,继续。

关于c# - 如何将异常标记为已记录(并且只记录一次)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27148612/

相关文章:

java - 寻找 .NET 3.5/J2EE 体系结构概念比较文章/图表

c# - 我应该只捕获异常以记录它们吗?

C# LINQ 组合数学 : All Combinations of a Set without the Empty Set

c# - 使用 C# 从控制台应用程序访问 HTTPS URL

c# - 如何在 C# 中向非泛型类的构造函数添加泛型约束

c# - 具有 3 位数字或 4 个字母数字字符的正则表达式 C#

c# - 如何验证 DataGridViewCheckBoxCell 是否被选中

asp.net - RouteValueDictionary 忽略空值

java - Java 可以抛出对异常的空引用吗?

c# - 参数超出范围异常