考虑一些可能会抛出已检查异常(类型为
您向用户报告的文本是否应包括异常的消息文本?也就是说,
我认为不应该,但似乎很多人不同意我的看法。那么我错在哪里了呢?我的论点如下。
我不是在询问报告堆栈跟踪是否有用。堆栈跟踪只对暗示错误的异常有用。也就是说,对于未经检查的异常。我认为在这种情况下,提供异常消息的低级详细信息不仅有用而且是强制性的。但我的问题涉及到已检查的异常,例如文件未找到。
我也不是在询问消息文本的最佳实践。
Exception
的异常)的代码。当然,您的代码会捕获该异常。您不仅仅是吞噬了该异常,而且您的代码还通过用户界面以某种方式向用户报告了该异常。也许是在日志文件中,或者使用GUI弹出窗口。您向用户报告的文本是否应包括异常的消息文本?也就是说,
Throwable.getMessage()
或Throwable.getLocalizedMessage()
提供的文本?我认为不应该,但似乎很多人不同意我的看法。那么我错在哪里了呢?我的论点如下。
- 当异常被抛出时,消息是在异常创建时生成的。因此,它最多只能提供非常低级别的信息,可能不适合向用户报告。
- 从哲学上讲,使用消息似乎违背了异常的整个目的,即将错误处理(
throw
部分)的检测和启动与处理和报告的完成(catch
部分)分离。使用消息意味着消息必须适合报告,这将责任转移给应该负责仅检测和启动的位置。也就是说,我认为Throwable
设计中的getMessage()
部分是一个错误。 - 消息没有本地化。尽管它的名称是
getLocalizedMessage()
,但并不是很有用,因为在捕获异常之前可能不知道要使用哪种语言环境(是要将报告发送到由英语系统管理员读取的系统日志,还是要弹出窗口供GUI的法国用户使用?)。 - 我听说Java 7具有更改进的
IOException
异常层次结构,使您能够在不同的catch
子句中处理不同类型的I/O错误,从而使getMessage()
文本变得不那么重要。这意味着即使Java设计师对getMessage()
也有些不舒服。
我不是在询问报告堆栈跟踪是否有用。堆栈跟踪只对暗示错误的异常有用。也就是说,对于未经检查的异常。我认为在这种情况下,提供异常消息的低级详细信息不仅有用而且是强制性的。但我的问题涉及到已检查的异常,例如文件未找到。
我也不是在询问消息文本的最佳实践。