关于异常:java – 在多个catch块中管理重复代码

java - Managing duplicate code in multiple catch blocks

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

我有以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    try {
        // code
    } catch (Exception1 e1) {
        if (condition) {
            //code
        } else {
            throw e1;
        }
    } catch (Exception2 e2) {
        if (condition) {
            //code
        } else {
            throw e2;
        }
    }

如何使用私有方法模块化两个捕获中的if-else块。

更具体地说,如果我使用一个方法,如何将不同的异常传递给该方法并适当地抛出它们?

我跟踪了这个链接,但不理解如何传递和抛出正确的异常。


如果使用Java 7,则可以使用新的管道语法:

1
2
3
4
5
6
7
8
catch (Exception1|Exception2 e)
{
  if(condition) {
    //code
  } else {
    throw e;
  }
}


这就像将if/else放入方法中一样简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try {
    // code
} catch (Exception1 e1) {
    logic(e1);
} catch (Exception2 e2) {
    logic(e2);
}


private void logic(Exception e) throws Exception {
    if (condition) {
        //code
    } else {
        throw e;
    }
}


有多种方法,一种简单的方法是将方法定义为:

1
2
3
4
5
6
7
private void method(Exception e){
if (condition) {
            //code
        } else {
            throw e1;
        }
}

那就在你抓到的时候叫它

1
2
3
4
5
6
7
try {
        // code
    } catch (Exception1 e1) {
        method(e1);
    } catch (Exception2 e2) {
        method(e2);
    }

你唯一要确保在回答人帖子中做的事情就是你需要把exception1放在exception2的超类中,否则不会编译。下面的Java 7答案是最好的处理方法,并按我解释的顺序处理。

Java 7中的更改列表

http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html