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

标签 c# .net exception resources cultureinfo

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

这是一个例子:

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

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

然而,除了向用户显示消息外,异常也可能被记录到日志文件中。我在我的日志文件中看到过很多消息,使用各种不同的文化来格式化它们。很难看!在这种情况下,InvariantCulture 可能更合适,或者可能是托管日志文件的服务器的文化。

这里的要点是,在格式化异常时,您永远不知道您的受众,因此似乎无法决定在格式化时使用哪种文化。如果能够将格式化推迟到捕获到异常的时间点,那就太好了,但这将远远超出 .NET 中实现异常的方式。

那么你对此有何看法?

最佳答案

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

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

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

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

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

关于c# - 使用 InvariantCulture 或 CurrentCulture 格式化异常消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3194679/

相关文章:

c# - 异常与返回码 : do we lose something (while gaining something else)?

c# - 加载位图时出现内存不足错误

c# - 如何仅为可见元素引发 OnPropertyChanged?

c# - 有什么方法可以知道插件是否引发了 MS CRM 异常?

C# powershell ErrorDetail 用法

c# - MVC ActionLink 将路由附加为查询字符串而不是路由值

c# - 将 IronPython 代码编译为 EXE 或 DLL

c# - 为什么 WinForms 应用程序默认是 STAThread?

exception - 捕捉导出(1);

c# - 如何在将 XML 文件导入 SQL Server Management Studio 时为存储过程创建进度条