【问题标题】:How to handle translation of exception message?如何处理异常消息的翻译?
【发布时间】:2013-08-02 08:52:12
【问题描述】:

我真的不知道在多语言应用程序中处理异常的最佳方法。

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

我应该在抛出异常后立即翻译 ctor 中的消息吗?

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

或者我是否抛出异常并使用自制的帮助程序,该帮助程序将使用视图逻辑中的异常类型查找错误消息?

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

或者,Microsoft 是否提供工具或机制来做到这一点?

一句话:处理异常消息翻译的好的做法是什么?

【问题讨论】:

  • 提示:永远不要向用户公开异常 :) 最好尝试让您的翻译经理翻译您自己的消息

标签: c# exception


【解决方案1】:

大多数例外情况都是出于技术目的,除非您的操作和维护人员也位于不同的国家/地区,否则这些例外情况应该只是以编写和维护应用程序的人员的语言来传达信息。

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

但是,某些类型的异常会被显式抛出以显示给用户。这些是您的 ValidationExceptionBusinessLayerException。他们的明确合同将显示给用户。当然,您应该本地化这些异常消息,但不是翻译它们,而是在抛出异常时从本地化资源中提取异常消息通常会更好、更容易:

throw new ValidationException(Resources.InvalidUserName);

【讨论】:

  • 只是一个问题:当应用程序以中文配置时,如何将其记录到文件中(我根本不懂的语言;))。
  • 不记录向用户显示的异常(即 ValidationException)。它们不是错误,但您可以使用它们快速安全地退出操作。通常只应记录技术异常。
  • 拥有两种类型的异常是个好主意:开发人员和最终用户异常,因为对异常的一般理解仅用于技术用途,因此这种想法似乎并不令人困惑?
【解决方案2】:

恕我直言,仅在需要显示时才翻译要好得多。 这适用于 any 可本地化的字符串,而不仅仅是错误消息。

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

【讨论】:

    【解决方案3】:

    外部代码不应翻译消息

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多