2012-03-24 26 views
3

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

+0

可能重复的[何时选择检查和未检查的异常](http://stackoverflow.com/questions/27578/when-to-choose-checked-and-unchecked-exceptions) – Bohemian 2012-03-24 15:04:55

+1

@dido:除了什么Jon Skeet回答说(你可以真正处理的例外情况相对较少),你必须问自己这个问题:“程序员如何能够用无数语言工作,甚至没有检查异常的概念? “*。 Checked异常对于Java来说非常特殊,并且每天都有大量的程序员在使用,而这些语言没有检查异常的概念。您的客户的问题域中存在检查异常。 300 KLOC代码库,在这里我们不会抛出一次检查异常。 – TacticalCoder 2012-03-24 15:10:27

+0

可能重复[对检查异常的情况](http://stackoverflow.com/questions/613954/the-case-against-checked-exceptions) – emory 2012-03-24 15:53:42

回答

10

据我了解,如果你只是声明了一个检查异常,将通过所有方法向下传播的主要方法,仍然中断正常的程序流程和程序仍然会停止工作。

绝对。这是一个事情如果发生了什么事真的无法处理。

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

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

当然,如果你能真正处理异常并继续前进,这是伟大的 - 但我的经验,也有相对几个错误,其中是这样的话。如果你正在编写一个服务器端应用程序,你通常要中止请求(并给客户端一个错误)。如果你正在编写一个用户界面,那么你可能只想放弃当前的操作,通知用户并让他们继续......这是一个稍微不同的情况。

但是无条件地捕捉所有异常并假装它们没有发生? <不寒而栗>

+0

fyi,我认为他的意思是* unchecked *(它会传播) 。你的答案虽然好:) – Bohemian 2012-03-24 15:06:50

+1

@Bohemian其实我认为他真的意味着_checked_异常,因为他在谈论必须在方法签名中声明它们。 – Thomas 2012-03-24 15:09:30

1

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

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

0

它适用于更复杂的系统。谁在链上使用你的代码可能想知道哪里出了问题,所以你让他们处理这个异常。它不一定完全一致(并且不可能真的,除非堆栈中的每一个方法抛出异常,这将打败整个目的。)

2

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

Java的检查异常试图通过强制您处理或声明异常来使此机制更加明确。这可以防止您忘记即将处理的异常。然而,许多人认为这是一个语言设计失败的实验(注意,没有其他语言采用检查异常),因为它迫使你在所有级别上都有一些与异常相关的代码 - 正是为了避免异常而设计的。

相关问题