【问题标题】:Converting system errors into friendly messages将系统错误转换为友好消息
【发布时间】:2013-03-18 11:39:15
【问题描述】:

我想知道是否有一种好方法可以将系统生成的错误转换为对用户更有意义的内容。例如,如果由于某种原因应用程序无法连接到 SMTP 服务器。我想将系统抛出的消息(类似于“SMTP 连接失败”)转换为“我们无法向您发送电子邮件”。我想从资源文件中提取这条友好消息。虽然这是一个此类例外的示例,但可能还有更多。

我们没有跨所有层的 try catch 块。它仅存在于 UI 层中。我们有一个异常管理类,它接受所有异常并从中返回一个友好的字符串。 UI 层中的每个 catch 块都会调用此异常管理类,并将 System.Exception 类型的异常传递给它,该异常的方法需要返回所述友好的错误字符串以在 UI 上使用。

我现在能想到的唯一方法是在异常管理类中设置一个大的 IF ELSE 块,用于检查接收到的异常字符串并从资源文件中提取匹配的友好消息。

有没有更好的方法来解决这个问题?

【问题讨论】:

  • IMO,这是一个好方法。资源文件或数据库表,简而言之,有一个占位符,您可以在其中映射错误代码或过于技术性的错误消息与您自己的自定义友好消息。对于未映射的消息,您可以为用户提供一般友好的消息。

标签: .net asp.net-mvc asp.net-mvc-4 exception-handling


【解决方案1】:

我认为您不能将异常映射到用户友好的错误。原因是异常是“发生了什么”,在相当低的级别上,而用户只想知道“为什么”发生了以及他们可以做些什么来修复它。将FileNotFound 映射到“系统试图访问不存在的文件”将无济于事。相反,捕获FileNotFound,然后根据应用程序的状态显示相关消息 - 将会。

另一个想法是为每个可能失败的进程提供不同的错误消息,并为该过程中抛出的任何异常显示该错误消息。如果您细化您的流程和尝试捕获,那么与将系统错误消息映射到用户可理解的错误消息相比,您将能够为用户提供更好的通知系统。

【讨论】:

    【解决方案2】:

    这就是为什么你有try catch 来捕获异常。只需将其与特定错误类型一起使用,而不是通用错误类型。因此,您可以在 catch 块内显示任何消息。但不建议在 catch 块内重新抛出自定义异常。在你的情况下,你可以赶上System.Net.Mail.SmtpException

    【讨论】:

    • 我们有一个异常管理类,它接收所有异常并从中返回一个友好的字符串。每个 catch 块都会调用这个异常管理类,该类的方法返回友好的错误字符串,以便在 UI 上使用。
    • 不要让异常管理类的友好消息依赖于异常文本。而是尝试使用异常类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2012-10-08
    相关资源
    最近更新 更多