用运行时异常替换已检查的异常?

时间:2012-06-08 06:47:07

标签: java exception-handling

鉴于我基本上想要消除已检查的异常使用并将它们转换为运行时异常,我通常会做这样的事情:

try {
    file.read();
} catch (IOException e){
    throw new RuntimeException(e); 
}

这样做有几个缺点,但最让我烦恼的是我的运行时异常将包含嵌套的堆栈跟踪。基本上我想将“IOException”作为RuntimeException(或“IORuntimeException”)重新抛出原始消息和stacktrace,这样我就可以避免无用的嵌套堆栈跟踪。我在中间某处重新抛出异常的“事实”对我来说似乎只是无用的噪音。

这可能吗?有没有这样做的图书馆?

6 个答案:

答案 0 :(得分:4)

Project Lombok允许您完全禁用已检查的例外。

答案 1 :(得分:3)

class IORuntimeException extends RuntimeException {

    final IOException ioex;

    public IORuntimeException(IOException ioex) {
        this.ioex = ioex;
    }

    @Override
    public String getMessage() {
        return ioex.getMessage();
    }

    @Override
    public StackTraceElement[] getStackTrace() {
        return ioex.getStackTrace();
    }

    //@Override
    // ...
}

(完整类可用here,由Eclipse“Generate Delegate Methods”宏生成。)

用法:

try {
    ...
} catch (IOException ioex) {
    throw new IORuntimeException(ioex);
}

答案 2 :(得分:3)

跟进我的评论。这是一个article,必须对这个问题有所了解。它使用sun.misc.Unsafe来重新抛出异常而不包装异常。

答案 3 :(得分:2)

如果您正在考虑另一个答案是使用Unsafe(我建议不要,但无论如何),另一个选择是滥用泛型用这种邪恶的方法抛出一个检查异常(来自http://james-iry.blogspot.co.uk/2010/08/on-removing-java-checked-exceptions-by.html):< / p>

   @SuppressWarnings("unchecked")
   private static <T extends Throwable, A> 
     A pervertException(Throwable x) throws T {
      throw (T) x;
   }


   public static <A> A chuck(Throwable t) {
      return Unchecked.
        <RuntimeException, A>pervertException(t);
   }

您也可以查看com.google.common.base.Throwables.getRootCause(Throwable)并打印其(根)堆栈跟踪。

答案 4 :(得分:0)

听起来你实际上需要检查例外

答案 5 :(得分:0)

从Java 8开始,还有另一种方式:

try {
  // some code that can throw both checked and runtime exception
} catch (Exception e) {
  throw rethrow(e);
}

@SuppressWarnings("unchecked")
public static <T extends Throwable> RuntimeException rethrow(Throwable throwable) throws T {
    throw (T) throwable; // rely on vacuous cast
}

*更多信息here