你应该报告exception的消息文本?

考虑一些可以抛出检查exception的代码( Exceptiontypes的Exception )。 当然,你的代码catch了exception。 你不只是吞下exception,你的代码通过你的用户界面以某种方式报告给用户。 在日志文件中,或者使用GUIpopup。

如果您向用户报告的文本包含exception的消息文本。 也就是说,由Throwable.getMessage()Throwable.getLocalizedMessage()提供的文本?

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

  • 该消息是在抛出exception时创build的。 因此,它最多只能提供非常低级的信息,这可能不适合向用户报告。
  • 在哲学上,使用这个信息似乎违背了例外的全部观点,即把检测和启动error handling( throw部分)与完成处理和报告( catch部分)区分开来。 使用该消息意味着该消息必须适合于报告,这将报告的责任移动到应仅仅负责检测和启动的位置。 也就是说,我认为ThrowablegetMessage()部分是错误的。
  • 该消息未本地化。 getLocalizedMessage()函数的名称并不是很好,因为在catchexception之前,您可能不知道要使用的语言环境(是由英文系统pipe理员读取的系统日志报告,还是popup在GUI的法国用户的窗口中?)。
  • 我听说Java 7有一个大大改进了IOExceptionexception层次结构,使您能够在不同的catch子句中处理不同types的I / O错误,使得getMessage()文本不那么重要。 这意味着即使Javadevise者也对getMessage()感到不舒服。

我不问是否报告堆栈跟踪是有用的。 一个堆栈跟踪对于一个表示错误的exception是唯一有用的。 也就是说,对于一个未经检查的exception。 我认为在这种情况下,提供exception消息的底层细节不仅是有用的,而且是强制性的。 但是我的问题涉及检查的exception,如文件未find。

不,不应该直接在错误消息中直接向用户显示exception,它们是低层次的技术细节,用户几乎总是想要一些更容易理解的东西,即使它没有提供像堆栈跟踪那样多的信息!

我几乎总是这样说,因为有些情况下(比如在IDE中),你可以考虑你的用户在技术上有足够的能力去查看堆栈跟踪; 事实上,在这种情况下,他们可能会更喜欢它的“虚弱”的错误信息。

然而,我个人认为堆栈跟踪应该总是logging在用户可以访问的地方,以便如果他们抱怨说“程序不能正常工作”,那么如果他们发送了这个文件,你就可以看到到底发生了什么。

如果您向用户提出错误条件,则应该是用户友好的消息。 例外包含用户不应该/不需要知道的技术细节。

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

如果您向用户显示错误消息,有一点您有意识地决定显示一个popup窗口,或添加一条消息到日志窗口。 在这一点上,您可以将任何exception转换为更加用户友好的消息。 请注意,您可能需要比默认的“ Exceptiontypes提供的信息更多的信息,因此您可以创build自己的“ Exceptiontypes,其中包含将所有需要的数据提供给用户的所有信息。

在一些项目中,我做了一个特殊的例外(例如UserFriendlyException)。 此exceptiontypes必须具有用户友好的错误消息。 如果我发现这样的例外,我可以把它显示给用户。

这使得用户友好的错误可以使用例外,并防止您向用户显示非常技术性的消息。

我会争辩说,你不应该向用户显示exception消息本身,它应该只会出现在日志中。 即使您有意使用户友好,仍然不能显示,因为您无法轻松地将这些消息国际化。 你应该想出一些你的UI层可以理解的机制,并将其解决为一个代码,你可以查看一个国际化的消息,以显示给你的用户。 我发现一个“代码”属性/枚举exception工作得很好。 非常特殊的例外工作,但可能是混乱维护。