繁体   English   中英

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

[英]When would you prefer to declare an exception rather than handling it in Java?

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

我的问题是:任何人都可以提供一个实例,通常在您希望调用方法来处理异常而不是当前方法的地方吗?

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

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

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

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

我想通过“超类”你的意思是调用你的方法的代码。

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

一般来说,如果您不知道如何处理问题,请不要。 以太传递它或将其包装在另一个异常中。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM