是否可以捕获除运行时异常之外的所有异常?

Posted

技术标签:

【中文标题】是否可以捕获除运行时异常之外的所有异常?【英文标题】:Is it possible to catch all exceptions except runtime exceptions? 【发布时间】:2012-11-02 22:45:44 【问题描述】:

我有一个语句会引发大量检查异常。我可以像这样为它们添加所有的 catch 块:

try 
    methodThrowingALotOfDifferentExceptions();
 catch(IOException ex) 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
 catch(ClassCastException ex) 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
 catch...

我不喜欢这样,因为它们都以相同的方式处理,所以存在代码重复,而且还有很多代码要编写。反而可以赶上Exception:

try 
    methodThrowingALotOfDifferentExceptions();
 catch(Exception ex) 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);

没关系,但我希望所有运行时异常都被丢弃而不被捕获。有什么解决办法吗?我在想,一些聪明的关于要捕获的异常类型的通用声明可能会奏效(或者可能不会)。

【问题讨论】:

【参考方案1】:

您可以执行以下操作:

try 
    methodThrowingALotOfDifferentExceptions();
 catch(RuntimeException ex) 
    throw ex;
 catch(Exception ex) 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);

【讨论】:

【参考方案2】:

如果您可以使用 Java 7,则可以使用 Multi-Catch:

try 
  methodThrowingALotOfDifferentExceptions();
 catch(IOException|ClassCastException|... ex) 
  throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);

【讨论】:

+1 提醒我注意 Java 7 中这个新的有价值的(并且早就应该使用的 IMO)功能 +1 出于这个原因,如果可以的话,我会使用 Java 7。但我不能,我很抱歉,因为这个 Multi-Catch 是完美的。我必须使用 Java 6 :(((【参考方案3】:

您可以尝试这样的事情,基本上捕获所有内容,然后重新抛出 RuntimeException 如果它是该类的实例...

try 
    methodThrowingALotOfDifferentExceptions();
 catch(Exception ex) 
    if (ex instanceof RuntimeException)
        throw ex;
    
    else 
        throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex);
    

看起来好像一遍又一遍地编写会很麻烦(并且不利于可维护性),我可能会将代码移到不同的类中,就像这样......

public class CheckException 
    public static void check(Exception ex, String message) throws Exception
        if (ex instanceof RuntimeException)
            throw ex;
        
        else 
            throw new MyCustomInitializationException(message, ex);
        
    

并像这样在您的代码中使用它...

try 
    methodThrowingALotOfDifferentExceptions();
 catch(Exception ex) 
    CheckException.check(ex,"Class Resolver could not be initialized.");

注意我们传入了message,这样我们仍然可以自定义我们的MyCustomInitializationException

【讨论】:

如果我需要做几次,最后一个选项会很好,但那不是我的情况 - 我只需要使用一次。只有我会使用String 消息对静态方法进行参数化。 您需要在代码中将ex 转换为RuntimeException

以上是关于是否可以捕获除运行时异常之外的所有异常?的主要内容,如果未能解决你的问题,请参考以下文章

当一个线程遇到异常时是不是可以冻结所有线程

异常抛出与捕获的思考

iOS异常信号的捕获和简单处理

java中异常分哪些种类:

Swift 捕获运行时异常

Android:onResume() 正在跳转到除异常之外的另一个活动