3

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

4

4 回答 4

10

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

绝对地。如果发生了你真的无法处理的事情,那是一件好事。

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

可以捕获异常,忽略它并仍然覆盖数据库中的数据......但这不是一件好事。一旦你处于你没有准备好的情况,或者你根本无法明智地继续,那么停止是负责任的事情

当然,如果你能真正处理异常并继续前进,那就太好了——但根据我的经验,这种情况下的错误相对较少。如果您正在编写服务器端应用程序,您通常希望中止请求(并给客户端一个错误)。如果您正在编写 UI,那么您可能只想放弃当前的操作,通知用户并让他们继续操作......这是一个稍微不同的情况。

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

于 2012-03-24T15:02:35.893 回答
3

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

Java 的检查异常试图通过强制您处理或声明异常来使这种机制更加明确。这可以防止您忘记要立即处理的异常。

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

于 2012-03-24T15:09:01.723 回答
1

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

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

于 2012-03-24T15:02:46.660 回答
0

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

于 2012-03-24T15:03:10.547 回答