何时使用多捕获以及何时使用重新抛出?

时间:2017-04-17 12:29:12

标签: java rethrow multi-catch

我对这两个主题非常不确定。我知道我应该使用multi-catch来处理需要以相同方式处理的异常。但出于什么目的,我真的需要这样的东西。

private void something(String name) throws IOException, RemoteException {
    try {
        ...
    } catch (Exception ex) {

        ... // do something

        throw ex;
    }
}

3 个答案:

答案 0 :(得分:3)

如果您考虑使用此方法,那么在执行期间抛出的任何异常都应以相同的方式处理,并且您希望在将异常传播到客户端之前执行任务,则可以执行此操作

例如,假设您希望在发生异常时执行特定处理,例如记录信息。所以你抓住它来完成这项任务 尽管如此,您认为捕获的异常是一个问题,并且记录它不是异常的“真实”处理。所以,你通过重新抛出它来让它传播。

答案 1 :(得分:2)

<强>重新抛出

每当您想要通知调用者方法有关异常时,您都会捕获并重新抛出异常。

说一些方法callSomething()正在调用你的方法()。如果在something()内发生任何异常,它将只捕获异常,因此应用程序不会失败,并将其重新抛出到callSomething()方法。然后callSomething()将通知客户端内部错误。

其他示例是,在MVC模式中,客户端提交的请求由来自控制器的某些方法基于请求映射提供。控制器将调用服务,服务将与dao的某些方法交互。如果在DAO中发生了一些异常,那么DAO将重新抛出异常服务,服务将重新抛出到控制器,并且它是控制器,它将通知客户端有关错误消息。 这在java中称为异常传播异常从一个方法传播到另一个方法,直到它被捕获

多次捕获

如果要对多种类型的异常执行相同的操作,则使用multi catch。

答案 2 :(得分:2)

您需要在以下情况下重新抛出

  1. 您希望在让异常离开方法之前预处理某些内容。但是,如果您不关心异常的类型,那么也可以在finally块中进行预处理。
  2. 您正在尝试将已检查的异常转换为未经检查的异常。在这种情况下,您将抓住所有例外catch(Exception ex)并将其重新抛出为throw new RuntimeException(ex)
  3. 您希望抛出自定义异常而不是内置异常。因此,您将捕获所有异常,然后创建自己的异常对象,最好取消选中,然后抛出它。许多API都是这样做的,例如Spring将不明确的JDBC异常转换为Spring自定义异常。
  4. 这有点像预处理。您希望跟踪通过创建ArrayList或其他内容而抛出的所有异常,以便在具有多个步骤的程序结束时,您知道哪些步骤会抛出异常。我已经看到在Talend生成的Java代码中使用了这个。
相关问题