是否应该报告异常的消息文本?

Should you report the message text of exceptions?

提问人:Raedwald 提问时间:9/6/2011 最后编辑:Raedwald 更新时间:10/9/2019 访问量:6279

问:

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

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

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

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

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

我不是在问消息文本的“最佳实践”。

Java 异常 日志记录

评论

0赞 Raedwald 9/7/2011
一个相关的问题:stackoverflow.com/questions/2790528/...
0赞 Pacerier 3/4/2012
没有一种尺寸适合所有人。这取决于“谁是你的目标受众?
0赞 Brent Bradburn 8/3/2018
是我一个人,还是所选的答案错过了问题的全部要点?
0赞 8protons 10/9/2019
自定义异常消息的可能重复项:最佳做法

答:

9赞 hvgotcodes 9/6/2011 #1

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

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

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

评论

1赞 Raedwald 9/6/2011
堆栈跟踪仅对表明错误的异常有用。也就是说,对于未选中的异常。我认为在这种情况下,提供异常消息的低级细节不仅有用,而且是强制性的。但我的问题涉及检查异常,例如找不到文件。
0赞 hvgotcodes 9/6/2011
如果您因为严重的错误而出现异常,您希望 QA 检测到它。尽管如此,如果应用程序崩溃,您可以显示一条消息,要求用户提交报告以进行重现。如果您对隐藏详细信息没有任何安全要求,请显示堆栈跟踪...。
5赞 Sjoerd 9/6/2011 #2

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

这样就可以对用户友好的错误使用异常,并防止向用户显示非常技术性的消息。

评论

2赞 Raedwald 9/7/2011
这仍然将创建用户友好消息的责任放在异常的位置,而不是异常的位置。它只是用一些来代替,这似乎并没有多大的收获。throwcatchgetMessage()getFriendlyMessage()
8赞 Michael Berry 9/6/2011 #3

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

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

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

1赞 Shane 11/15/2013 #4

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