带有参数的本地化错误消息

本文关键字:错误 消息 本地化 参数 | 更新日期: 2023-09-27 18:10:05

场景1:假设您在业务层中有一个复杂的检查或计算,并且由于某些数据错误或丢失而导致计算失败。例如,捕获计算异常。

场景2:假设您在业务层查询数据层(数据库),并捕获丢失记录异常。

任务:您现在处于业务层,挂在带有尚未解决的异常的catch块中。你想通知用户有一个错误,因为参数X与参数Y不匹配,你需要本地化错误消息(为简单起见,你有两种语言)。

问题:

    a)如何将错误传播到表示层。
  • b)如何定位错误并保留消息中的参数?例如:"亲爱的用户,由于数据X与数据Y不匹配,计算失败"

建议的答案:

  • a)从业务层抛出另一个异常,将先前的异常作为内部异常。
  • b) 这是我正在寻找的关键答案。让我们假设您可以提供参数值,因为它是一个内部网应用程序,用户需要知道这些参数是错误的。

问题是关于应用程序的设计-如何"翻译/本地化异常"或向用户显示翻译/本地化的错误消息,当你在代码中有一个异常被捕获的点,并且可能有多个异常和多个消息。

异常消息使用统一的语言,假设为英语。

带有参数的本地化错误消息

我们在应用程序中这样做。我们采用的方法是:

  1. 不捕获业务层错误。允许所有异常传播回发出原始调用的表示层方法。

  2. 在数据访问层抛出自定义异常。通常,当在查询数据库时发生数据访问异常时,会抛出数据库特定的错误。在数据访问层捕获该异常,但将其封装在自定义异常中。我们有一个叫做DataAccessException的,它有一个枚举属性,表明是哪个数据访问层调用导致了错误,另一个属性表明错误的原因是访问相关的(权限不足)还是因为数据库抛出了错误。

  3. 捕获表示层中的所有错误。在调用服务层的表示层方法中,有一个try-catch块。通常有一个catch子句的每个异常类型,你希望抛出的代码在较低的层次。在catch块中,您创建本地化消息,将其记录到事件日志(如果有的话),并将错误显示给用户。

  4. 所有可本地化字符串都应该是资源字符串。这不是一个硬性的规则,但是使用资源字符串的方法意味着很容易在将来添加对Windows支持的其他语言的支持。为每个不变的字符串定义一个资源标识符。每个字符串接受的参数数量也不会改变。所有改变的是措辞和"{0}","{1}"等参数出现在字符串中的位置。

编辑

我在这里回复你的评论,因为回复太长了,我无法在一个评论中容纳。

本地化消息是基于我在特定catch块中处理的异常创建的。我试图使错误消息易于阅读。也就是说,您必须假设读者完全不了解任何编程知识。你概括地描述出了什么问题;最好不要提及具体的例外情况。例如,当您尝试打开文件时,FileNotFoundException的消息应该是这样的:"无法找到名为"{0}"的文件。"请确保您输入的文件名正确。"如果你家里有人不是程序员,就想想你该如何向他们解释这个问题。你可能会收到好的留言。

至于给它什么资源键,我使用命名约定。对于我们的MVC web应用,约定是

我通常的做法是本地化一个格式字符串。资源包括格式字符串,如下所示:

string errorString "Dear user the computation has failed because data {0} does not match data {1}";

抛出异常或显示错误时,只需插入数据

string.Format(errorString, dataX, dataY);

Edit:由于您希望异常文本使用统一的语言,并且您不想稍后将异常类型映射到资源字符串,因此最好的选择是将资源字符串以及数据提供给异常,或者让异常同时携带原始消息和翻译消息。

映射问题的另一个选择是您可以使用反射。这样,您就可以使用异常类型并在资源中查找所述类型,而无需显式地映射它们。您可以到参考资料中查找一个属性,例如"Error_MyCustomException"。这将为每个Exception类型提供一个自定义消息,您所需要存储的只是数据。