我们在我们的应用程序中执行此操作。我们采取的方法是:
在服务层没有发现错误。允许所有异常传播回原始调用的表示层方法。
在数据访问层中抛出自定义异常。通常,如果在查询数据库时发生数据访问异常,则会引发数据库特定的错误。在数据访问层捕获该异常,但将其包装在自定义异常中。我们有一个名为DataAccessException
的枚举属性,该枚举属性指示哪个数据访问层调用导致了错误,另一个属性指示错误的原因是与访问相关(权限不足)还是因为数据库抛出错误。
捕获表示层中的所有错误。在调用服务层的表示层方法中,有一个try-catch
块。每个异常类型通常会有一个catch
子句,您期望由较低层中的代码引发该异常类型。在该catch
块中,您将创建本地化消息,将其记录到事件日志中(如果有),并将错误显示给用户。
所有可本地化的字符串应该是资源字符串。这并不是一条硬性规则,但使用资源字符串方法意味着它可以轻松添加对Windows未来支持的其他语言的支持。您为每个不会更改的字符串定义资源标识符。每个字符串所需的参数数量也不会改变。所有这些变化都是字符串,“{0}”,“{1}”等参数出现在字符串中。
编辑
我回答您的评论在这里,因为响应时间比我可以适合在一个评论。
根据我在特定catch
块中处理的异常创建本地化消息。我尝试使错误消息可读。也就是说,你必须假设读者完全不懂任何编程知识。你描述一般情况下出了什么问题;最好不要提到确切的例外情况。例如,尝试打开文件时出现FileNotFoundException
的消息应该显示为“找不到名为”{0}“的文件,请确保您正确输入了文件名。”如果家中有人不是程序员,只要想一想你如何向他们解释问题&你可能会有一个好消息。
至于要给它什么资源键,我使用命名约定。对于我们的MVC网络应用程序,约定是<控制器> <动作> <消息名称>。一旦定义了密钥,代码将始终使用密钥来检索该消息,方法是请求该属性与VS构建的ResourceManager
中的密钥名称相同。
在您构建资源字符串时由VS创建的ResourceManager
类使用区域设置来确定要检索哪个本地语言消息字符串。返回的字符串以及所需的任何参数将传递到string.Format
,并显示或记录结果。
我们在代码中有一条规则,即消息字符串的参数始终是不需要转换为其他语言的东西。也就是说,用户输入的字符串,或者数字或日期都可以,但枚举值不是。这是因为我们的Web应用程序显示自身和Windows WPF应用程序生成的审核消息,并且不知道WPF应用程序中的任何枚举。由于ResourceManager
是partial
类,因此您可以轻松地向其添加方法,以便按照您的要求对枚举进行本地化。这是你的控制。然后,您可以调用该方法对枚举值进行本地化,然后将其传递到string.Format
,您需要这样做。
我没有得到你提出的答案的含义,但@ private_meta的答案对你的案例来说非常有用和直接。 –
这个问题是关于概念,如果你愿意的话,而不是如何将参数插入字符串 - “每个人”都知道。 – Santhos
我想知道还有什么地方可以提出这样的问题,如果你觉得太过分了。我还没有找到任何有关它的好文章,我认为这是一个非常普遍的情况,很多程序员都在这里遇到困难。 – Santhos