1

我们有一个日志类,它有一个带参数的日志方法:

public void LogTrace(String message, params object[] parameters)
{
  ..
  .. String.Format(message, Parameters);

当在没有参数但使用一些格式化占位符的情况下调用 LogTrace 时,.NET 约定/期望是什么?例如

LogTrace("This is a {poorly written} log message");

或者

LogTrace("This is {0} log message");

具体来说 - 您是否希望这会引发异常,或者只是按原样记录纯文本?在第一种情况下,它只记录纯文本似乎“很好”,但在第二种情况下,它可能表明您实际上忘记了一个参数。

从概念上讲,这里似乎有两种不同的功能,一种用于记录纯文本,另一种用于记录格式化消息。那么也许应该有两种不同的方法?

4

3 回答 3

1
  • String.Format("This is a {0} {1} log message", "poorly");会抛出(一个参数太少)
  • 这是一件好事:这意味着在涉及的任何设施的日志记录部分都存在错误。这应该由记录器记录。
  • 您仍然可以通过尝试捕获循环始终传递一个参数(例如“[undefined]”)来解决此问题(并尽可能生成原始消息),这将记录This is a poorly [undefined] log message. 不要让这成为一个无限循环!
于 2013-10-23T23:24:08.437 回答
1

string.Format当它需要参数并且您不提供它们时会抛出异常。message如果格式不正确,它将引发异常- 括号之间有垃圾。您可以防止空参数列表

public void LogTrace(String message, params object[] parameters)
{
    if(parameters != null && parameters.Length > 0)
        var s = String.Format(message, Parameters);
    else
        var s = message;
    // do something with s
}

当参数的数量不对应时,它仍然会出现问题message,但我会让它抛出异常,而不是试图掩盖问题并记录晦涩的消息。

于 2013-10-23T23:24:55.463 回答
1

我认为这两种方法都可以(如果你真的需要它们):

LogTrace(message, params) {
    // just don't catch exceptions from String.Format method, so It 
    // is possible to throw FormatException or ArgumentNullException
}

LogTrace(message) {
    // place a plain text, e.g. This is {0} log.
}

我认为这很容易理解和使用。

于 2013-10-23T23:26:12.470 回答