java多个catch_在Java中是否可以在同一个catch块中捕获两个异常?

本问题已经有最佳答案,请猛点这里访问。

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

catch (Exception e, ExtendsRuntimeException re) {

// common logic to handle both exceptions

}

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

有一个看docs.oracle.com JavaSE 7 /文档/ / / / / / technotes导游语言& hellip;更多的Java 7检测。我的小兄弟这个问题和它的答案,所以我们收到工作票。

Java 7及其后

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

语法是:

try {

// stuff

} catch (Exception1 | Exception2 ex) {

// Handle both exceptions

}

ex的静态类型是列出的异常中最专门化的通用父类型。有一个很好的特性,如果您在catch中重新执行ex,编译器知道只能抛出列出的异常之一。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之前声明的局部变量,这会变得混乱。如果handler方法需要重新引发异常(并且检查了异常),那么签名就会遇到严重的问题。具体地说,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的这个处理程序可能会以静默方式接收异常!

如果是这种情况,那么生成的catch块将如何处理特定类型异常所特有的函数?例如,ex.functionFromExceptionType2()vs ex.functionFromExceptionType1()。

@piaches491(1)绝大多数异常都有完全相同的方法集;(2)如果您希望Type1和Type2的行为不同,则不能使用此构造。

我也这么想。我只是想确定一下

@埃默里我可能错了,但例外是客观存在的。那么,您不能使用instanceof函数来查看您的异常对象是否属于catch语句中的一种类型或另一种类型吗?因此,您可以捕获、执行公共代码,然后让带有instanceof的if块执行不同的代码。

@右边的黑褐色。它看起来是向后的,但您可以在catch语句中使用casting。

@emory-只有当您不将异常视为对象时,它才看起来是向后的:—)

它非常适合测试。我用它做:catch (AssertionError | Exception ex)。

Java<= 6 .x只允许您捕获每个catch块中的一个异常:

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

文档:

Each catch block is an exception handler and handles the type of

exception indicated by its argument. The argument type, ExceptionType,

declares the type of exception that the handler can handle and must be

the name of a class that inherits from the Throwable class.

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

catch (IOException|SQLException ex) {

logger.log(ex);

throw ex;

}

文档:

In Java SE 7 and later, a single catch block can handle more than one

type of exception. This feature can reduce code duplication and lessen

the temptation to catch an overly broad exception.

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

如果不在Java 7上,则可以将异常处理提取到方法——这样可以至少最小化复制。

try {

// try something

}

catch(ExtendsRuntimeException e) { handleError(e); }

catch(Exception e) { handleError(e); }

回答正确+1。sample code没有意义。如果您的命名约定是好的,那么ExtendsRuntimeException就是Exception。所以不需要第一个catch块。一个更好的示例是catch(runtimeexceptiona e)handleab(e);catch(runtimeexceptionb e)handleab(e);catch(runtimeexceptionc e)handlec(e);`不可能将它们全部折叠到EDOCX1中〔9〕->

即使使用Java 7,这种方法也可能是必要的。例如,如果要处理EDCOX1,10和(非EDCOX1,11),EDCOX1,12,同样,但要处理(非EDCOX1,13,13)EDCOX1,11不同,那么新的Java 7语法是没有用的。

在JavaSE 7启动之前,我们习惯于用多个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子句中的多个异常不仅简化了代码,而且减少了代码的冗余。我发现这篇文章很好地解释了这个特性及其实现。从Java 7改进和改进异常处理这对你也有帮助。

你的回答迟了18个月,没有添加任何新内容。在这种情况下,最好简单地对包含有用信息的答案进行投票。

对于Java< 7,可以使用if除异常之外:

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);

}

}

编辑并替换了可丢弃的。

我觉得这比杰夫的答案更易读

您应该避免捕获过于广泛的异常,这是促使Java 7更改的原因。此外,你不应该抓住你无法处理的事情。最后,您不应该捕获错误,因此您也不应该捕获更广泛的可丢弃项。

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

try {

// your code

} catch (Exception1 | Exception2 ex) {

// Handle 2 exceptions in Java 7

}

我在做学习卡,这条线很有用,只想放进我的两分钱。

你的答案迟了6个月,没有添加任何新内容。在这种情况下,最好简单地对包含有用信息的答案进行投票。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值