- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当抛出异常时,我经常传入一个格式化的字符串来公开有关已发生问题的详细信息。如果可能,我总是指定一个格式化提供程序(这是一个很好的做法,否则你可能会忘记决定哪种文化是合适的,因为默认是当前文化,这可能会导致许多错误)。
这是一个例子:
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/
我有一个使用任务的应用程序。我们还修改了 cultureInfo(我们使用 EN-US 语言,但保留日期/数字格式),我们使用 .Net 4.0。 应用程序有很多线程和任务,我们有一个用于创建任务/线
谁能告诉我 Application.CurrentCulture 和 Thread.CurrentCulture 之间的区别。 线程有CurrentCulture 和CurrentUICulture。
我需要根据每种文化的资源文件在运行时更改文化。 我需要根据两种文化更改表单中控件的属性其中有指定的.resx文件 resorces1.aspx.resx // default resorces1.as
在 .net 2 winforms 应用程序中,为整个应用程序设置文化的好方法是什么? 为每个新线程设置 CurrentThread.CurrentCulture 是重复且容易出错的。 理想情况下,我
CultureInfo.CurrentCulture 可以为空吗? 空值会使我的程序崩溃,这是我不想要的。所以我问,为了安全起见,我需要做什么吗? var culture = CultureInfo.
我有一个具有以下命名空间的窗口 xmlns:sysglb="clr-namespace:System.Globalization;assembly=mscorlib" 包含一个文本框 根据 Gusd
正如您所看到的,我尝试将线程的 CurrentCulture 捕获到实例变量中,以便我可以在整个类中重用它,但它并没有持久存在。在上面的照片中,我显示即使在分配它之后,值仍然不同。这是为什么? 最佳答
我们的应用程序允许用户更改他们运行它的文化,并且该文化可以与底层操作系统文化不同。我发现这样做的唯一方法是为每个线程设置 Thread.CurrentThread.CurrentCulture 和 T
Thread.CurrentCulture 从哪里获取数据?客户端(浏览器)或服务器。 另一个问题,这是找出用户文化的正确方法吗? 谢谢 最佳答案 Thread.CurrentCulture 获取正在
我用一个按钮创建了一个简单的窗口应用程序 public partial class Form1 : Form { public Form1() { Initialize
我有一个错误报告,其中 double.Parse(input) 在输入 "0.69803923368454" 时抛出以下异常: FormatException: Unknown char: . Sys
我的解决方案中有多个项目:我有一个名为“Api”的 WebApi 项目,它引用了一个名为“Models”的类库。我在我的网络配置中设置全局化信息是这样的: 我的“模型”项目中有一些资源 (.resx
在 iPhone 上,用户可以选择他的显示语言和用于格式化的区域。 显示语言相当于.NET的Thread.CurrentUICulture,即UI的语言。 格式化区域等同于 .NET 的 Thread
尽管我本地化了当前文化,但以下代码返回英文名称。 List languageList = new List(); CultureInfo[] cultureList = CultureInfo.Get
在较旧的 asp.net 项目中,我们通常在 Application_BeginRequest - 处理程序 (Global.asax) 中设置语言,如下所示: System.Threading.Th
使用: Console.WriteLine(System.Globalization.CultureInfo.CurrentCulture.ToString()); 我得到 “en-US”。 我应该在
我将 Global.asax 设置为: protected void Application_BeginRequest(object sender, EventArgs e) {
根据我的研究,不可能更改线程的时区。所以我的问题是为什么你不能? 我原以为将您的应用程序的文化切换到特定国家/地区也会改变这种情况,这似乎是 IMO 的预期行为。 编辑 修改后我明白了为什么默认情况下
我试图获取客户的国家/地区,因此我使用 CultureInfo.CurrentCulture。问题是,当我的加拿大客户使用我的网站时,他们显示为美国人。 看起来 CultureInfo.Current
使用完整的 .NET 框架,您可以使用以下方法获取/设置当前线程的文化和 UI 文化: Thread.CurrentThread.CurrentCulture = culture; Thread.Cu
我是一名优秀的程序员,十分优秀!