您是否应该报告例外的消息文本?

Rae*_*ald 12 java logging exception

考虑一些可以抛出已检查异常的代码(类型异常Exception).catch当然,你的代码是个例外.您不仅要吞下异常,您的代码也会通过您的用户界面以某种方式向用户报告.或许在日志文件中,或使用GUI弹出窗口.

您向用户报告的文本是否应包含例外的消息文本.也就是说,通过提供的文本Throwable.getMessage()Throwable.getLocalizedMessage()

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

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

我不是在询问报告堆栈跟踪是否有用.堆栈跟踪仅对建议错误的异常有用.也就是说,对于未经检查的异常.我认为在这种情况下提供异常消息的低级细节不仅有用而且是强制性的.但我的问题涉及已检查的异常,例如file-not-found.

Mic*_*rry 7

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

我几乎总是说,因为有些情况(例如在IDE中)你可以认为你的用户在技术上足够能够看到堆栈跟踪; 事实上,在这种情况下,他们可能更喜欢它是一个"愚蠢的"错误信息.

但是,我个人认为应该始终将堆栈跟踪记录在用户可以访问的某个位置,这样如果他们抱怨"程序无法运行",您可以确切地看到他们发送给您的文件时发生了什么.


hvg*_*des 6

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

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

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


Sjo*_*erd 5

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

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

  • 这仍然负责在“抛出”异常的位置创建用户友好的消息,而不是在“捕获”它的位置。它只是用一些 `getFriendlyMessage()` 替换了 `getMessage()`,这似乎没什么好处。 (2认同)