【问题标题】:NLog - Throw exception and log message at the same timeNLog - 同时抛出异常和记录消息
【发布时间】:2017-07-14 08:56:37
【问题描述】:

我有以下方法,其中包括一开始的验证检查。我正在使用NLog,我想记录异常消息并“同时”抛出异常,尽可能避免代码膨胀。

目前,我执行以下操作,但似乎有点笨重。有没有更好的办法?

public static void ValidateValue(string value)
{
    if (!string.IsNullOrWhiteSpace(value) && value.Contains(","))
    {
        ArgumentException ex = new ArgumentException(string.Format("value cannot contain ',': {0}", value));
        Logger.Error(ex);
        throw ex;
    }
}

我正在寻找的更多是

public static void ValidateValue(string value)
{
    if (!string.IsNullOrWhiteSpace(value) && value.Contains(","))
        throw Logger.Error<ArgumentException>("value cannot contain ',': {0}", value);
}

Logger.Error&lt;&gt; 方法在记录消息后返回 ArgumentException

这似乎很有用,而且很可能已经存在,但也许我必须推出自己的扩展方法?

谢谢!

【问题讨论】:

  • 如果你想使用泛型,你必须使用反射来创建异常对象,可能更容易手动传入一个新的异常对象。

标签: c# .net exception-handling nlog


【解决方案1】:

不推荐在同一个地方记录和抛出异常,因为:

  • 您可能会为同一错误获取多个日志(在多个级别上)
  • 您可能忘记记录异常

我会推荐以下内容:

  • 在高级别的地方捕获异常并将它们记录到那里(通用)
  • 仅记录您不会(重新)抛出的异常
  • 在不记录它们时添加上下文信息,我使用以下帮助器:

    public static TException SetContextData<TException>(this TException exception, object key, object value) 
           where TException : Exception
    {
        exception.Data[key] = value;
        return exception;
    }
    

    用法:

    throw ex.SetContextData("someContext", 123)
            .SetContextData("anotherId", 133);     
    

    使用 NLog,您可以按如下方式记录异常数据:

    ${exception:format=toString,Data:maxInnerExceptionLevel=10}
    

【讨论】:

  • 你说的很对。在创建异常时记录异常不会提供任何上下文信息。最好在应用程序将要对错误执行某些操作(或忽略)时记录它,因为可以将有关错误在 try {} catch () {} 上下文中实际表示的附加信息添加到日志中。感谢您为我解决这个问题:0)
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2021-04-23
  • 2014-04-27
  • 2014-06-10
  • 2014-03-26
相关资源
最近更新 更多