从异常实例化中排除FxCop DoNotPassLiteralsAsLocalizedParameters违规或本地化异常消息

时间:2010-09-01 14:46:22

标签: c#

我在以下方法代码中为两个异常抛出行获取了DoNotPassLiteralsAsLocalizedParameters FxCop违规行为:

public bool IsPageAccessible(string url, string documentId) {
    if (url == null) {
        throw new ArgumentNullException("url", @"url must not be null, use string.Empty if you don't care what the url is.");
    }

    if (documentId == null) {
        throw new ArgumentNullException("documentId", "documentId must not be null, use string.Empty if you don't care what the documentId is.");
    }
    return true;
}

这意味着:

  

fxcop全球化#CA1303字符串   嵌入源中的文字   代码很难本地化。避免   将字符串文字作为参数传递   在本地化的情况下   字符串通常是预期的。最   本地化的应用程序,例如,   应该本地化字符串参数   传递给异常构造函数。   创建Exception实例时   因此,检索字符串参数   从字符串表更多   比字符串文字更合适。

推理:

我不希望本地化异常消息。只有英语很好。即使我们正在构建API,所有开发人员都知道英语。并且不应该在生产服务器上向访问者显示异常消息。

问题:

  • 您是否不同意我对异常消息本地化的理由?为什么?
  • 有没有办法只从所有异常实例化中排除此FxCop警告?我们本地化了API的其他部分。那些将最终用户可见文本的部分。因此,我们从这些案例中保留警告的价值。
  • 您认为我应该怎么处理这个问题?

1 个答案:

答案 0 :(得分:1)

我认为你的推理很好,我讨厌当我在Visual Studio中有本地化异常而无法找到帮助时,因为编程的通用语言是英语。

更一般地说,你不应该试图遵守每个fxcop规则,这很快就会成为一种负担。最好专注于一部分规则。

我认为您不能在特定例外中排除警告,但您可以使用SuppressMessage属性排除检测:

[SuppressMessage("Microsoft.Globalization", 
                 "CA1303:DoNotPassLiteralsAsLocalizedParameters", 
                 Justification="Exception are not localized")]
public bool IsPageAccessible(string url, string documentId) {
  if (url == null) {
    throw new ArgumentNullException("url", @"url must not be null, use string.Empty if you don't care what the url is.");
  }

  if (documentId == null) {
    throw new ArgumentNullException("documentId", "documentId must not be null, use string.Empty if you don't care what the documentId is.");
  }
  return true;
}

另一种方法是编写custom fxcop rule来添加此行为。