【问题标题】:Should you report the message text of exceptions?您应该报告异常的消息文本吗?
【发布时间】:2011-11-11 07:33:36
【问题描述】:

考虑一些可以引发检查异常(Exception 类型的异常)的代码。当然,您的代码catches 例外。您也不只是吞下异常,您的代码通过您的用户界面以某种方式向用户报告它。也许在日志文件中,或者使用 GUI 弹出窗口。

您向用户报告的文本是否应包含异常的消息文本。即Throwable.getMessage()Throwable.getLocalizedMessage()提供的文字?

我认为不是,但似乎很多人不同意我的观点。那么我做错了什么?我的论点如下。

  • 消息是在引发异常时创建的。因此,它最多只能提供非常低级别的信息,这可能不适合向用户报告。
  • 从哲学上讲,在我看来,使用该消息与异常的全部意义背道而驰,即将错误处理的检测和启动(throw 部分)与处理和报告的完成(catch 部分)分开。使用消息意味着消息必须有利于报告,这将报告的责任转移到应该只负责检测和启动的位置。也就是说,我认为Throwable 设计中的getMessage() 部分是一个错误。
  • 消息未本地化。尽管有它的名字,getLocalizedMessage() 并不是很好,因为您可能不知道要使用什么语言环境,直到您 catch 例外(是转到您的英语系统管理员读取的系统日志的报告,还是为 GUI 的法语用户弹出一个窗口?)。
  • 我听说Java 7 对IOException 有很大改进的异常层次结构,使您能够在不同的catch 子句中处理不同类型的I/O 错误,从而使getMessage() 文本不那么重要。这意味着即使是 Java 设计人员也对getMessage() 感到有些不舒服。

我不是在问报告堆栈跟踪是否有用。堆栈跟踪只会对提示错误的异常有用。也就是说,对于未经检查的异常。我认为在这种情况下,提供异常消息的低级细节不仅有用而且是强制性的。但我的问题涉及检查的异常,例如文件未找到。

我问的不是"best practice" for the message text

【问题讨论】:

标签: java exception logging


【解决方案1】:

我认为您永远不应该向用户显示异常消息本身,它应该只出现在日志中。即使您有意使其用户友好,它仍然不应该显示,因为您无法轻松地将这些消息国际化。您应该提出一些您的 UI 层可以理解的机制并将其解析为您可以查找国际化消息以显示给用户的代码。我发现带有“代码”属性/枚举的异常效果很好。非常具体的例外也有效,但维护起来可能很麻烦。

【讨论】:

    【解决方案2】:

    不,异常不应直接在错误消息中直接显示给用户,它们是低级技术细节,用户几乎总是想要更易于理解的东西,即使它提供的信息不如堆栈多跟踪会!

    我说几乎总是因为在某些情况下(例如在 IDE 中),您可以认为您的用户技术能力足以查看堆栈跟踪;实际上在这种情况下,他们可能更喜欢它而不是“愚蠢”的错误消息。

    但是,我个人认为堆栈跟踪应该始终记录在用户可以访问的位置,这样如果他们抱怨“程序不工作”,您就可以确切地看到他们向您发送该文件时发生了什么。

    【讨论】:

      【解决方案3】:

      在某些项目中,我会制造一种特殊的异常(例如 UserFriendlyException)。此异常类型必须具有用户友好的错误消息。如果我捕获到这样的异常,我可以将其显示给用户。

      这使得对用户友好的错误使用异常成为可能,并防止您向用户显示非常技术性的消息。

      【讨论】:

      • 这仍然是在throws 异常的位置创建用户友好消息的责任,而不是在catches 它的位置。它只是用一些getFriendlyMessage() 替换了getMessage(),这似乎没有太大的收获。
      【解决方案4】:

      如果您向用户呈现错误情况,它可能应该是用户友好的消息。例外包含用户不应该/不需要知道的技术细节。

      在某些情况下,显示堆栈跟踪信息可能是一个安全问题,因此不应向用户显示堆栈跟踪。

      如果您向用户显示错误消息,有时您会有意识地决定显示弹出窗口或向日志窗口添加消息。此时,您可以将任何异常转换为更加用户友好的消息。请注意,您可能需要比默认 Exception 类型提供的更多信息,因此您可以/应该创建自己的 Exception 类型,其中包含向用户呈现所需的所有数据所需的所有信息。

      【讨论】:

      • 堆栈跟踪只会对提示错误的异常有用。也就是说,对于未经检查的异常。我认为在这种情况下,提供异常消息的低级细节不仅有用,而且是强制性的。但我的问题涉及检查异常,例如文件未找到。
      • 如果您因为严重的错误而出现异常,您希望 QA 检测到它。尽管如此,如果应用程序崩溃,您可以显示一条消息,要求用户提交报告以进行重现。如果您对隐藏详细信息没有任何安全要求,请显示堆栈跟踪....
      猜你喜欢
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多