代码之家  ›  专栏  ›  技术社区  ›  Sandor Drieënhuizen

使用InvariantCulture或CurrentCulture格式化异常消息?

  •  3
  • Sandor Drieënhuizen  · 技术社区  · 14 年前

    当抛出异常时,我经常传入一个格式化的字符串,该字符串会公开已发生问题的详细信息。如果可能的话,我总是指定一个格式设置提供程序(这是一个很好的实践,因为否则您可能会忘记决定哪个区域性是适当的,而默认的是当前区域性,这会导致许多错误)。

    下面是一个例子:

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

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

    但是,除了向用户显示消息之外,异常也可能被记录到日志文件中。我在日志文件中看到过许多消息,其中包含各种用于格式化它们的文化。相当丑陋!在这种情况下, InvariantCulture 可能更适合承载日志文件的服务器的区域性。

    这里的要点是,当格式化一个异常时,您只是永远不了解您的受众,所以似乎不可能决定格式化时使用哪种文化。如果能够将格式延迟到捕获异常的时间点,那将是非常好的,但这将远远超出在.NET中实现异常的方式。

    你对此有何看法?

    2 回复  |  直到 13 年前
        1
  •  5
  •   ollb    14 年前

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

    但是,如果您尽可能地本地化异常消息(如.NET Framework),则需要使用所选资源程序集的区域性。这可以确保数字格式和语言匹配,即使没有可用的本地化(即,它返回到英语)。

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

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

    例如,除非以这种方式明确配置,否则WCF不会向用户报告异常详细信息。见 IncludeExceptionDetailInFaults 配置设置和“小心”块。

        2
  •  1
  •   MagicBuzz    13 年前

    imho您可以使用异常类的“data”属性。 这样,您可以将要记录的不变消息存储在“消息”属性中。 您可以在“数据”集合中添加一个keypair值,其中key=“ui message”和value=ui消息的格式正确,符合用户区域性(并且可能是根据正确的区域性翻译的消息)。 在异常处理程序中,为了记录或显示正确的消息,您可能只需要在消息属性和数据对之间进行选择。