一尘不染

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

java

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

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

我认为不是,但是似乎很多人不同意我的看法。那我怎么了?我的论据如下。

  • 该消息是在引发异常时创建的。因此,它充其量只能提供非常低级的信息,可能不适合向用户报告。
  • 从哲学上讲,在我看来,使用消息与异常的整体观点相反,这是将错误处理的检测和启动(throw部分)与处理和报告的完成(部分)分开catch。使用该消息意味着该消息必须能够很好地进行报告,从而将报告的责任转移到仅应负责检测和启动的位置。也就是说,我认为getMessage()设计的一部分Throwable是错误的。
  • 该消息未本地化。尽管有它的名字,但是它getLocalizedMessage()并不是很好,因为你可能直到你catch例外之前都不知道要使用什么语言环境(是要转到英语系统管理员阅读的系统日志的报告,还是要在窗口中弹出以查看GUI的法语用户?)。
  • 我听说Java 7为改进了异常层次结构IOException,使你能够处理不同catch子句中的各种I / O错误,从而使getMessage()文本的重要性降低。这就意味着,即使Java设计人员对,也有些不满意getMessage()。
    我不是问报告堆栈跟踪是否有用。堆栈跟踪只会对提示错误的异常有用。也就是说,对于未经检查的异常。我认为在这种情况下,提供异常消息的低级详细信息不仅有用,而且是强制性的。但是我的问题涉及已检查的异常,例如文件未找到。

阅读 351

收藏
2020-03-23

共1个答案

一尘不染

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

在某些情况下,显示堆栈跟踪信息可能是安全问题,所以永远不要向用户显示堆栈跟踪。

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

2020-03-23