【发布时间】: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()感到有些不舒服。
我不是在问报告堆栈跟踪是否有用。堆栈跟踪只会对提示错误的异常有用。也就是说,对于未经检查的异常。我认为在这种情况下,提供异常消息的低级细节不仅有用而且是强制性的。但我的问题涉及检查的异常,例如文件未找到。
【问题讨论】:
-
没有一种尺寸适合所有人。这取决于“你的目标受众是谁?”
-
只有我一个人,还是选择的答案错过了问题的全部要点?