首页 > 解决方案 > 异常处理执行流程

问题描述

我应该知道这一点,但由于某种原因,我现在无法弄清楚。

有没有办法重写这段代码来避免instanceof

try {
    //Exceptions may happen
} catch (Exception1 exception1) {
    //do stuff only in case of Exception1
} catch(Exception e) {
    // do stuff in all exception cases except Exception1
    if (e instanceof Exception2) {
        // do stuff only in case of Exception2
    }
}

标签: javaexception

解决方案


如果您打算Exception对内联进行异常处理,并且不想重复它,那么唯一的解决方案就是 OP 解决方案。

但是,如果您可以将常见的异常处理放入一个函数中,那么这将是整洁的:

try {
    //Exceptions may happen
} catch (Exception1 exception1) {
    //do stuff only in case of Exception1
} catch(Exception2 e) {
    doCommonStuff();
    doException2Stuff();
} catch(Exception e) {
    doCommonStuff();
}

但是,上述情况可能会导致一个小问题,即您是否希望将控制权传递到 try/catch 块之外,或者您是否希望返回一个值,甚至抛出另一个异常。

您可能会发现,尽管您的代码的所有路径都会引发异常,但上述使用常见异常处理程序方法的构造可能会像某些控制路径一样看起来像某些控制路径一样。

因此,您可以表达一个通用的异常处理程序,它总是会抛出这样的异常:

private <T> T throwLastException(Exception2 input) {
   // blah blah blah
   throw new SomeException();
}

这可以作为返回语句的一部分调用,该语句似乎保证调用函数返回一个值,而实际上它只是告诉编译器不要担心:)


推荐阅读