您何时更愿意声明异常而不是在Java中处理异常?

时间:2010-05-13 16:00:26

标签: java exception exception-handling try-catch throws

我知道如果我们希望它由调用方法处理,我们可以为我们的方法声明异常。如果封闭方法抛出IOException,这甚至允许我们执行诸如写入OutputStream之类的操作而不将代码包装在try / catch块中。

我的问题是:任何人都可以提供一个实例,通常在您希望调用方法处理异常而非当前方法的情况下进行此操作吗?

编辑:我的意思是在最后一行调用方法而不是超类。

8 个答案:

答案 0 :(得分:3)

一般情况下,我会设计你的异常流程,以便异常被实际采取适当行动的代码捕获

这通常意味着在“库”方法(或大型项目中的某种通用实用方法)中,您将抛出异常而不捕获它们。

另一方面,如果您遇到这种情况,您发现自己声明了抛出异常的方法,那么您实际上几乎不会发生异常(例如,序列化通常涉及各种虚假检查异常,实际上不会发生,例如,如果你对Integer进行反序列化,那么Integer类不太可能存在,但你仍然需要捕获相应的异常),然后你有第三个选项重新转换为RuntimeException。

答案 1 :(得分:2)

我认为“超类”是指调用方法的代码。

如果您希望调用者比您的方法更了解问题,那么您可以将此责任传递给调用堆栈。

一般情况下,如果您不知道如何处理问题,请不要。以太传递它或将其包装在另一个例外中。

答案 2 :(得分:1)

如果你不能以合理的方式处理错误(例如显示错误信息,采取替代路径等),那么就让它冒泡。

答案 3 :(得分:1)

如果您希望在应用程序的不同级别处理错误。

这是一个半具体的例子。假设我有一个Web应用程序,它实现为一系列状态动作。假设在处理状态时,数据库访问会导致SQLException被抛出。在我的应用程序正常运行期间不会发生这种情况;只有在数据库出现问题时才会发生这种情况。

访问数据库的方法不需要知道我处理半致命错误的程序是什么。该逻辑在更高级别实现 - 在处理状态的方法中 - 对于任何运行时错误它实际上都是相同的,无论它是否真的是RuntimeException:向用户说出一个漂亮的错误消息他们联系技术支持。

想象一下,如果我必须向访问数据库的每个方法添加一个try / catch块执行此逻辑,并且可能抛出SQLException。这就是所谓的nightmare

答案 4 :(得分:1)

我使用了考试作为在应用程序的架构层之间传递信息的一部分。

例如:
如果DAO(数据库访问层)获得SQLException,它会抛出一个自定义的DAOLayerException,它被业务层捕获,而业务层又抛出一个由表示层捕获的异常。
这是针对未经检查的例外情况。

如果函数要由多个调用者使用或在函数开发时未知,我通常会遵循抛出 checked 未经检查的异常(不处理它们)的做法。

答案 5 :(得分:0)

在Web框架(如spring)中,您经常会让错误传播,容器会处理它们(通过向用户显示错误页面或消息,回滚事务等)。

此外,还有很多你从未捕获的java错误,比如OutOfMemoryError。你可以抓住它们,但是你无法妥善处理它们。

答案 6 :(得分:0)

你问了一个例子,这是一个常见的例子。

如果要编写代码来读取特定的文件格式,这些通常会声明IOException。原因是它可能被桌面应用程序(想要放置对话框)或文本实用程序(想要编写错误消息)或Web应用程序(想要返回错误代码)使用。异常处理允许您这样做。

答案 7 :(得分:0)

是的,我会声明它,所以它传播到一个父调用方法,它实际上会处理它(在UI上显示,打破那里,...)

对于Instance,我可能在sendEmail方法中有一些帮助方法。如果帮助方法说checkEmailAddress()产生异常,我希望sendEmail知道它,它可以进一步传播它或在UI上发出警报"电子邮件错误"