【问题标题】:Format exception messages using InvariantCulture or CurrentCulture?使用 InvariantCulture 或 CurrentCulture 格式化异常消息?
【发布时间】:2010-07-07 12:34:51
【问题描述】:

在抛出异常时,我经常传入一个格式化的字符串,该字符串会公开有关已发生问题的详细信息。如果可能,我总是指定格式提供程序(这是一种很好的做法,因为否则您可能会忘记决定哪种文化是合适的,并且默认是当前文化,这可能会导致许多错误)。

这是一个例子:

throw new InvalidOperationException(
    string.Format(
        CultureInfo.CurrentCulture,
        "{0} is a bad number.",
        number));

我很想使用CurrentCulture,如上所示,因为异常消息是针对人类的(当然,代码不应该对异常消息本身起作用)。该消息将使用客户的文化进行格式化,因此每当我需要将其显示给我的客户时,它看起来都不错。

但是,除了向用户显示消息外,异常情况也可能会记录到日志文件中。我已经看到我的日志文件中有许多消息,其中包含用于格式化它们的各种文化。真是丑!在这种情况下,InvariantCulture 可能更合适,或者可能是托管日志文件的服务器的文化。

这里的重点是,在格式化异常时,您永远不了解您的受众,因此似乎无法决定在格式化时使用哪种文化。能够将格式化推迟到捕获异常的时间点会很棒,但这将超出 .NET 中实现异常的方式。

那么您对此有何看法?

【问题讨论】:

    标签: c# .net exception resources cultureinfo


    【解决方案1】:

    由于您的异常消息是英文的,所以我会坚持不变的文化。为什么要将英文文本与非英文数字格式混合使用?

    但是,如果您要对异常消息进行本地化(如 .NET 框架所做的那样),您可能希望使用所选资源程序集的区域性。这可确保数字格式和语言匹配,即使没有可用的本地化版本(即回退到英语)。

    但是,在我的理解中,异常消息主要是针对开发人员的。因此我不会考虑将它们本地化,除非这是一个拥有来自世界各地的开发人员的大项目。如果您无法处理异常,您应该捕获它并向用户提供一些适合给定上下文的错误消息(并且可能与异常消息一样精确,也可能不一样)。

    向他们提供异常消息本身可能(尤其是对于 Web 服务器)会暴露有关可能被恶意使用的服务器软件的详细信息。我认为最好记录异常并向用户提供(本地化的)错误消息和一些数据,以便将日志事件(很可能是非本地化的、不变的文化)与他们的反馈相关联。

    例如,WCF 不会向用户报告异常详细信息,除非以这种方式明确配置。请参阅IncludeExceptionDetailInFaults 配置设置和那里的“警告”块。

    【讨论】:

    • 谢谢,这些都是很好的论据。我之前曾考虑在捕获到未处理的异常时向用户显示异常消息(例如在 ASP.NET 中的 global.asax 中),但我同意最好记录异常并显示通用(本地化)消息。这种方法使整个故事变得简单:始终使用 InvariantCulture 格式化异常消息,并且从不将消息暴露给客户端。
    【解决方案2】:

    恕我直言,您可以使用异常类的“数据”属性。 这样,您可以将要记录的不变消息存储在“消息”属性中。 您可以向“数据”集合添加一个密钥对值,其中 Key = "UIMessage" 和 Value = 您的 ui 消息已正确格式化为用户文化(并且可能是您的消息根据正确的文化翻译)。 在您的异常处理程序中,您可能只需要在 Message 属性和您的 Data 对之间进行选择,以便记录或显示正确的消息。

    【讨论】:

    • 这是一个有趣的想法。
    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 2011-03-14
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多