当抛出异常时,我经常传入格式化的字符串,公开有关发生问题的详细信息。如果可能的话,我总是指定一个格式化提供者(这是很好的做法,否则你可能会忘记决定哪种文化是合适的,因为缺省是当前的文化,这可能导致很多错误)。使用InvariantCulture或CurrentCulture格式化异常消息?
下面是一个例子:
throw new InvalidOperationException(
string.Format(
CultureInfo.CurrentCulture,
"{0} is a bad number.",
number));
我很想用CurrentCulture
,如上图所示,由于异常消息针对人类(ofcourse,代码不应该对异常消息本身行事)。消息将使用客户端的文化进行格式化,因此无论何时我需要将其展示给我的客户端,它看起来都不错。
但是,除了向用户显示消息之外,还可以将异常记录到日志文件中。我看到许多消息都放在我的日志文件中,用于格式化各种文化。很难看!在这种情况下,InvariantCulture
会更合适,或者是托管日志文件的服务器的文化。
这里的要点是,格式化一个异常时,你只是永远不知道你的受众,所以当格式化时决定使用哪种文化似乎是不可能的。如果能够将格式推迟到捕获异常的地方,那将是非常好的,但这将超出在.NET中实现异常的方式。
那么你对此有何看法?
谢谢,这些都是很好的论点。我曾经想过在每当发现一个未处理的异常时(例如在global.asax中的ASP.NET中)向用户显示异常消息,但我同意最好记录异常并显示通用(本地化)消息。该方法使整个故事变得简单:使用InvariantCulture始终格式化异常消息,并且不会将消息公开给客户端。 – 2010-07-07 14:44:06