5

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

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

        ... // do something

        throw ex;
    }
}
4

3 回答 3

3

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

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

于 2017-04-17T12:31:36.737 回答
2

重投

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

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

另一个例子是,在 MVC 模式中,客户端提交的请求由控制器基于请求映射的某种方法提供服务。Controller会调用service,service会和dao的一些方法进行交互。如果 DAO 发生异常,DAO 将向服务重新抛出异常,服务将向控制器重新抛出,控制器将错误消息通知客户端。这在 java中称为异常传播。异常从一个方法传播到另一个方法,沿着调用堆栈向上传播,直到它被捕获

多抓

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

于 2017-04-17T12:43:20.893 回答
2

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

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