这个问题在这里已经有答案了:
我可以在同一catch子句中捕获多个Java异常吗?
(10个答案)
(10个答案)
七年前关闭的
我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做一些类似的事情:
捕获(异常e,扩展运行时异常re){
//处理这两种异常的通用逻辑
}
是否可以避免在每个catch块中重复处理程序代码
Java7及更高版本
从Java7开始,支持多个异常捕获
语法是:
试试看{
//东西
}捕获(例外1 |例外2 ex){
//处理两个异常
}
ex的静态类型是所列异常中最特殊的常见超类型。有一个很好的特性,如果您在catch中重新调用ex,编译器知道只能抛出列出的异常中的一个
Java6及更早版本
在Java7之前,有一些方法可以处理这个问题,但它们往往不雅观,并且有局限性
方法#1
试试看{
//东西
}捕获(例外1例){
手部异常(ex);
}捕获(例外2例){
手部异常(ex);
}
公共无效句柄异常(超级异常){
//在这里处理异常
}
如果异常处理程序需要访问在try之前声明的局部变量,那么这会变得混乱。如果处理程序方法需要重新显示异常(并检查异常),那么签名就会遇到严重问题。具体来说,handleException必须声明为抛出SuperException。。。这可能意味着您必须更改封闭方法的签名,等等
进近#2
试试看{
//东西
}捕获(超级例外){
如果(例外情况1的实例| |例外情况2的实例){
//处理异常
}否则{
掷骰子;
}
}
再一次,我们有一个潜在的签名问题
方法#3
试试看{
//东西
}捕获(超级例外){
如果(例外情况1的实例| |例外情况2的实例){
//处理异常
}
}
如果省略了else部分(例如,因为目前没有SuperException的其他子类型),代码将变得更脆弱。如果对异常层次结构进行了重新组织,那么这个没有else的处理程序可能会以静默方式吃掉异常