Java中是否可以在同一个catch块中捕获两个异常? [重复]

问题描述 投票:0回答:6

我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做这样的事情:

catch (Exception e, ExtendsRuntimeException re) {
    // common logic to handle both exceptions
}

是否可以避免在每个 catch 块中重复处理程序代码?

java exception try-catch
6个回答
237
投票

Java 7 及更高版本

从 Java 7 开始支持多个异常捕获

语法是:

try {
     // stuff
} catch (Exception1 | Exception2 ex) {
     // Handle both exceptions
}

ex
的静态类型是列出的异常中最专业的常见超类型。有一个很好的功能,如果您在 catch 中重新抛出
ex
,编译器知道只能抛出 listed 异常之一。


Java 6 及更早版本

在 Java 7 之前,有一些方法可以处理这个问题,但它们不优雅并且有局限性。

方法#1

try {
     // stuff
} catch (Exception1 ex) {
     handleException(ex);
} catch (Exception2 ex) {
     handleException(ex);
}

public void handleException(SuperException ex) {
     // handle exception here
}

如果异常处理程序需要访问在

try
之前声明的局部变量,这会变得混乱。如果处理程序方法需要重新抛出异常(并且已检查),那么您会遇到严重的签名问题。具体来说,
handleException
必须声明为抛出
SuperException
...这可能意味着您必须更改封闭方法的签名,等等。

方法#2

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     } else {
         throw ex;
     }
}

我们再次遇到签名方面的潜在问题。

方法#3

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     }
}

如果省略

else
部分(例如,因为目前没有
SuperException
的其他子类型),代码会变得更加脆弱。如果重新组织异常层次结构,没有
else
的处理程序最终可能会默默地吃掉异常。


注意:如果上面的

SuperException
Exception
,你要么吃掉(所有)未经检查的异常,要么发现你正在重新抛出带有签名
Exception
的异常。这两件事都会有问题。


34
投票

Java <= 6.x just allows you to catch one exception for each catch block:

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

文档:

每个catch块都是一个异常处理程序并处理异常类型 由其参数指示的异常。参数类型,ExceptionType, 声明处理程序可以处理并且必须处理的异常类型 继承自 Throwable 类的类的名称。

对于 Java 7,您可以在一个 catch 块上捕获多个异常:

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

文档:

在 Java SE 7 及更高版本中,单个 catch 块可以处理多个 异常类型。此功能可以减少代码重复并减少 捕获过于广泛的异常的诱惑。

参考: http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html


12
投票

如果您不是使用 java 7,您可以将异常处理提取到一个方法中 - 这样您至少可以最大程度地减少重复

try {
   // try something
}
catch(ExtendsRuntimeException e) { handleError(e); }
catch(Exception e) { handleError(e); }

2
投票

对于 Java < 7 you can use if-else along with Exception:

try {
    // common logic to handle both exceptions
} catch (Exception ex) {
    if (ex instanceof Exception1 || ex instanceof Exception2) {

    }
    else {
        throw ex;
        // or if you don't want to have to declare Exception use
        // throw new RuntimeException(ex);
    }
}

编辑 Throwable 并将其替换为 Exception。


2
投票

http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html涵盖了在同一块中捕获多个异常。

 try {
     // your code
} catch (Exception1 | Exception2 ex) {
     // Handle 2 exceptions in Java 7
}

我正在制作学习卡,这个帖子很有帮助,只是想投入我的两分钱。


2
投票

在 Java SE 7 发布之前,我们习惯于编写包含多个与 try 块关联的 catch 语句的代码。 一个非常基本的例子:

 try {
  // some instructions
} catch(ATypeException e) {
} catch(BTypeException e) {
} catch(CTypeException e) {
}

但是现在有了 Java 的最新更新,我们可以在单个 catch 子句中处理多个异常,而不是编写多个 catch 语句。这是一个示例,展示了如何实现此功能。

try {
// some instructions
} catch(ATypeException|BTypeException|CTypeException ex) {
   throw e;
}

因此单个catch子句中的多个Exception不仅简化了代码,还减少了代码的冗余。 我发现这篇文章很好地解释了这个功能及其实现。 Java 7 改进且更好的异常处理 这也可能对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.