如何在Java中捕获所有已检查的异常(在单个块中)?

Ste*_*ers 6 java exception try-catch runtimeexception checked-exceptions

编辑:这个问题只涉及Java 1.6(及以下).抱歉没有在原帖中说清楚.

这里的层次结构显示Java Exception分为两种类型:RuntimeException不是RuntimeException:

Java异常层次结构

我可能会错过一些东西,但不会更好地分成类似的东西UncheckedExceptionCheckedException不是吗?例如,以下语句具有相当多的已检查异常:

try {
    transaction.commit();
} catch (SecurityException e) {
} catch (IllegalStateException e) {
} catch (RollbackException e) {
} catch (HeuristicMixedException e) {
} catch (HeuristicRollbackException e) {
} catch (SystemException e) {
}
Run Code Online (Sandbox Code Playgroud)

我只是真的对它是成功还是失败感兴趣所以想要将已检查的异常作为一个组来处理,而不是未经检查的异常,因为捕获意外错误不是好的做法.所以考虑到这一点,也许我可以这样做:

try {
    transaction.commit();
} catch (Exception e) {
    if (e instanceof RuntimeException) {
        // Throw unchecked exception
        throw e;
    }
    // Handle checked exception
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但这看起来非常糟糕.有没有更好的办法?

Dav*_*der 6

如果我理解正确,那么你几乎就在那里.抓住RuntimeException.这将捕获RuntimeException及其下层的所有内容.然后是Exception的一个漏洞,你就被覆盖了:

try {
    transaction.commit();
} catch (RuntimeException e) {
    // Throw unchecked exception
    throw e;
} catch (Exception e) {
    // Handle checked exception
    // ...
}


And*_*niy 5

Java 7 允许你这样的结构:

try {
    transaction.commit();
} catch (SecurityException | IllegalStateException  | RollbackException | HeuristicMixedException  e ) {
   // blablabla
}
Run Code Online (Sandbox Code Playgroud)

UPD:我认为,在早期版本的Java中没有好的方便的方法.这就是Java语言开发人员引入这种结构的原因Java 7.所以,你可以设计自己的方法Java 6.