首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用多重捕获,何时使用重新抛出?

问何时使用多重捕获,何时使用重新抛出?
EN

Stack Overflow用户
提问于 2017-04-17 12:29:11
回答 3查看 767关注 0票数 5

我对这两个话题很不确定。我知道,对于需要以同样的方式处理的异常,我应该使用多重捕获。但为了什么目的我真的需要这样的东西。

代码语言:javascript
复制
private void something(String name) throws IOException, RemoteException {
    try {
        ...
    } catch (Exception ex) {

        ... // do something

        throw ex;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-17 12:31:36

如果考虑到此方法在执行过程中引发的任何异常都应以相同的方式处理,并且在允许将异常传播到客户端之前要执行任务,则可以这样做。

例如,假设您希望在异常发生时执行特定处理,例如记录信息。所以你抓住它来完成这个任务。

尽管如此,您仍然认为捕获的异常是一个问题,记录它并不是对异常的“真正”处理。所以,你让它通过重抛传播。

票数 3
EN

Stack Overflow用户

发布于 2017-04-17 12:43:20

ReThrow

每当您想通知调用方异常时,就会捕获并重新抛出异常。

假设某个方法callSomething()正在调用您的方法()。如果某个()内部出现任何异常,它只会捕获异常,因此应用程序不会失败,并将其重新抛给callSomething()方法。然后callSomething()会将内部错误通知客户端。

另一个例子是,在MVC模式中,客户端提交的请求是通过某种基于请求映射的控制器提供的。控制器将调用服务,服务将与某种dao方法交互。如果DAO中出现异常,DAO将重新抛出异常到服务,服务将重新抛给控制器,并由控制器将错误消息通知客户端。这在java中被称为异常传播。异常在调用堆栈上从一个方法传播到另一个方法,直到被捕获为止。

多捕

如果要对多个类型的异常执行相同的操作,则使用多个捕获。

票数 2
EN

Stack Overflow用户

发布于 2017-04-17 12:49:04

您需要在以下情况下重新投递

  1. 您希望在允许异常离开该方法之前对某些内容进行预处理。但是,如果您不关心异常的类型,那么也可以在finally块中进行预处理。
  2. 您正在尝试将检查的异常转换为未检查的异常。在这种情况下,您将捕获所有异常为catch(Exception ex),并将它们重新抛出为throw new RuntimeException(ex)。
  3. 您希望您的自定义异常被抛出而不是在构建的异常中抛出。因此,您将捕获所有异常,然后创建自己的异常对象,最好是未选中的异常对象,然后抛出异常对象。许多API都这样做,例如Spring将非托管的JDBC异常转换为Spring自定义异常。
  4. 这个有点像预处理。您希望通过创建一个ArrayList或其他东西来跟踪所有抛出的异常,以便在程序结束时通过多个步骤知道哪些步骤会抛出异常。我见过在Talend生成的Java代码中使用这个方法。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43451515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档