声明异常而不是处理它有什么意义

时间:2012-03-24 15:00:03

标签: java exception try-catch throw try-catch-finally

据我了解,如果您只声明一个已检查的异常,它将通过您的所有方法传播到main方法,并且仍会中断您的正常程序流程,您的程序仍将停止工作。那么,为什么不总是使用try / catch处理已检查的异常...这样你的程序不会因异常而停止?为什么要在方法的签名中声明异常?抱歉我的英文不好

4 个答案:

答案 0 :(得分:10)

  

据我了解,如果您只声明一个已检查的异常,它将通过您的所有方法传播到main方法,并且仍会中断您的正常程序流程,您的程序仍将停止工作。

绝对。如果发生了真正无法处理的事情,这就是的事情。

例如,假设您有一个程序将使用文件中的某些数据更新您的数据库 - 但您无法加载该文件。

可能只是捕获异常,忽略它并仍然覆盖数据库中的数据......但那是一件好事。一旦你处于一种你没有做好准备的情况,或者你从根本上不能理智地继续下去,那么停止是负责任的事情

当然,如果你能真正处理异常并继续前进,那就太棒了 - 但根据我的经验,相对几乎没有错误。如果您正在编写服务器端应用程序,则通常希望中止请求(并向客户端发出错误)。如果您正在编写用户界面,那么您可能只想放弃当前操作,通知用户并让他们继续......这种情况略有不同。

但无条件地捕捉所有异常并假装它们没有发生? <颤动>

答案 1 :(得分:3)

例外的一点是你可以选择在哪个级别来捕获它们;您不必立即执行此操作 - 有时这是正确的做法,但单个顶级catch子句可以通过记录它们然后跳到下一个任务/请求(例如在servlet中)来处理所有其他异常容器)。

Java的已检查异常会强制您处理或声明异常,从而使此机制更加明确。这可以防止您忘记要立即处理的异常。

然而,许多人认为这是一个失败的语言设计实验(请注意,没有其他语言采用检查异常),因为它迫使您在所有级别都有一些与异常相关的代码 - 确切地说是要避免的异常。

答案 2 :(得分:1)

例如,如果调用方法能够更好地处理异常。

假设你有一些阅读文件的方法。如果文件不存在,该方法将如何知道需要发生什么?也许整个程序应该终止,也许我们应该通过弹出窗口通知用户,也许它应该记录异常并继续,也许它应该尝试从备份恢复文件。只有调用方法知道,所以它应该实现异常处理。

答案 3 :(得分:0)

适用于更复杂的系统。无论谁在链上方使用你的代码,都可能想知道出了什么问题,所以你让他们处理异常。它不会一直到main(并且不能真的,除非堆栈中的每个方法都抛出异常,这会破坏整个目的。