【发布时间】:2010-07-12 14:06:40
【问题描述】:
重新抛出已检查和未检查的异常有什么用?
【问题讨论】:
标签: java exception exception-handling
重新抛出已检查和未检查的异常有什么用?
【问题讨论】:
标签: java exception exception-handling
如果你想在问题发生时执行一些代码而不隐藏问题。
例如,假设您想在写入数据库时发生异常时回滚更改:
try {
writeToDatabase();
} catch(Exception ex) {
rollbackChanges();
}
如果您使用此代码,调用函数将永远不会发现发生了异常。
相反,你应该写
try {
writeToDatabase();
} catch(Exception ex) {
rollbackChanges();
throw ex;
}
【讨论】:
说白了:使用异常处理。
考虑到这一点,在出现异常之前(或者,在开发人员了解如何正确使用异常处理之前),如果出现“错误”,程序员会返回类似 -1 或 null 的错误代码。考虑到这一点,您将如何告诉某些方法失败了(例如:大型 API 中的某些低级 IO 方法失败)?您可以将大量返回 nulls/ 或 -1 串在一起,或者只是抛出一个异常,以便它迁移回它应该被捕获的地方,如果需要,甚至是 JVM 本身因为这个例外可能是你无法恢复的。
所以基本上,如果您无法编写可以真正从抛出的异常中恢复的捕获逻辑,您将重新抛出异常。这在 Java 中经常是这种情况,因为 Java 会强制您捕获几乎所有的异常,因为大多数情况都是经过检查的异常。
至于重新抛出已检查与未检查...在执行 J2EE 应用程序时,我经常会从已检查异常内部将新的未检查异常 (RuntimeExpcetion) 抛出回容器。容器具有处理异常并向用户显示默认错误页面的默认方式。这来自Aspect Oriented 范式。我也wrote about how to do this here。
【讨论】: