所有行完成执行后处理异常

时间:2017-01-03 12:15:47

标签: java exception-handling

即使methodC1()存在异常,我也需要执行methodC2。这里我只添加了两个方法,如methodC1()和methodC2()。让我们说有很多方法。在这种情况下,解决方案也应该适用。

    abstract class A {
        abstract String methodC1() throws ExceptionE;
        abstract String methodC2() throws ExceptionE;

        protected String methodA() throws ExceptionE2 {
            try {
                methodC1();
                methodC2();
            } catch (ExceptionE e) {
                 throw new ExceptionE2();
            }
        }
    }

    class C extends A {
        String methodC1() throws ExceptionE {
            // do something
        }

        String methodC2() throws ExceptionE {
             // do something
        }
    }

4 个答案:

答案 0 :(得分:0)

通常,您不希望从同一方法的异常中恢复。

如果您真的需要这样做,您可以将“很多”方法打包到其他方法,如果可以的话,他们可以分享业务逻辑和异常处理。 例如,如果上述失败,则可能不应运行方法。

此外,您可以在自己的try catch中使用每个方法,以便继续执行。

或者你可以制作一个执行列表,以便在for循环中执行它们。

答案 1 :(得分:0)

不要使用throws ExceptionE而是在methodC1和methodc2上使用try catch块。

abstract class A {
    abstract String methodC1 ();
    abstract String methodC2 ();

    protected String methodA (){
        methodC1();
        methodC2();
    }
}

class C extends A {
    String methodC1 () {
       try{
           //code
       } catch (ExceptionE e) {
           //handle exception
       }
    }

    String methodC2 () {
       try{
           //code
       } catch (ExceptionE e) {
            //handle exception
       }
    }
}

答案 2 :(得分:0)

这是一种方式:

protected String methodA() throws ExceptionE2 {
try {
    methodC1();
} catch (ExceptionE e) {
    throw new ExceptionE2();      // HERE
} finally {
    try {
        methodC2();
    } catch (ExceptionE e) {
        throw new ExceptionE2();  // THERE
    }
}

如果methodC1methodC2都抛出异常,则从ExceptionE2传播的methodAfinally块内抛出的// THERE;即// HERE第一个(抛出的methodC1)被“吃掉”。

还有其他方法可以处理这个要求,但这个方法最简单,并且不需要更改methodC2ExceptionE的签名。

如果您需要传播编码来自ExceptionE2个例外的错误信息的异常,那么您将需要重新设计protected String methodA() throws ExceptionE2 { List<ExceptionE> exceptions = new ArrayList<>(); try { methodC1(); } catch (ExceptionE e) { exceptions.add(e); } try { methodC2(); } catch (ExceptionE e) { exceptions.add(e); } if (!exceptions.isEmpty()) { throw new ExceptionE2(exceptions); } } 以便它可以包装多个异常。 (两个例外不可能在Java中同时传播......或者我所知道的任何其他编程语言。)

最终结果可能如下所示:

Employees
- employee_id
- name
- email
- password
- is_manager
- listOfProjects // There are list/map or Set data type which can be used
- listOfSkills 

Projects
- project_id
- title
- description
- owner
- manager

Skills
- skill_id
- skill

答案 3 :(得分:0)

在try-catch中添加Finally块可以解决您的问题。无论catch块中的操作结果如何,最后都被调用。

try{
    methodC1();
}
catch(ExceptionE e){
    throw new ExceptionE2();
}
finally{
    methodC2();
}