如何处理异常信息的翻译?

9

我不是很清楚如何在多语言应用程序中处理异常才最佳。

在哪里处理错误消息的翻译(Exception.Message)?

我是否应该在构造函数中立即翻译并抛出异常时?

throw new MyException("Error message", Resource.MyException_TranslatedMessage);

我应该抛出异常,然后使用自己编写的帮助程序,在视图逻辑中使用异常类型来查找错误消息吗?

try
{
    //...
}
catch(Exception ex)
{
    myLabel.Text = new ExceptionTranslator(ex).Translate();
}

那么,微软是否提供工具或机制来完成这项工作呢?

简而言之:如何处理异常消息的翻译才是良好的实践呢?


提示:永远不要向用户公开异常 :) 最好尝试使用您的翻译管理器翻译自己的消息。 - Kamil Budziewski
3个回答

16

大多数异常都是为了技术目的而存在的,除非您的运维团队也位于不同的国家,否则这些异常应该只使用撰写和维护应用程序的人的语言。

.NET框架包含本地化的异常消息。对于我作为开发人员来说,这非常烦人,因为我的本地语言(荷兰语)的异常消息并没有像原始的英文异常消息那样有意义。然而,微软将框架异常消息本地化似乎是合理的,因为它们的目标受众可以位于任何地方。

然而,某些类型的异常明确地被抛出以显示给用户。 这些是您的ValidationExceptionBusinessLayerException。它们的明确约定是要显示给用户。 当然,您应该本地化这些异常消息,但是与其翻译它们,通常从本地化资源中提取异常消息并抛出异常会更好、更容易:

throw new ValidationException(Resources.InvalidUserName);

只是一个问题:当应用程序配置为中文(我完全不理解的语言)时,您如何将其记录到文件中? - JiBéDoublevé
向用户显示的异常(例如ValidationException)不会被记录。它们不是错误,但您可以使用它们快速而安全地退出操作。通常只有技术性异常应该被记录。 - Steven
有两种类型的异常:开发人员异常和最终用户异常,这是一个非常好的想法。不过,考虑到异常通常仅用于技术用途,这是否会有点令人困惑呢? - Abdulkarim Kanaan

2

在我看来,最好只在需要显示时才翻译它。这适用于任何可本地化的字符串,而不仅限于错误消息。

理想情况下,代码的逻辑不应关心消息的内容或语言,它只关心异常的类型。只有呈现层(可能)需要以本地语言显示它。


1

外部代码不应该翻译消息

throw new MyException("Error message", Resource.MyException_TranslatedMessage);

这是我心中最好的解决方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接