需要在实现中抛出已检查的异常,但它不会被接口抛出?

时间:2015-07-08 14:26:06

标签: java exception accumulo

我实现了Accumulo BatchWriter接口,以便在插入之前对记录执行一些额外的计算。如果出现问题,该计算可能会抛出一个已检查的异常,但BatchWriter抛出的唯一异常是MutationsRejectedException。因此,当I尝试进行预处理时发生错误时,我无法抛出必要的已检查异常。

现在,我可以捕获已检查的异常并简单地在其位置抛出另一个异常:一个未经检查的异常,如某些RuntimeException或MutationsRejectedException。这两个选项看起来都不是很好 - 一个未经检查的异常是一个很差的模拟异常,我想在抛出MutationsRejectedException时实际抛出它并不能让我看到错误的实际原因。

这里的最佳做法是什么?

2 个答案:

答案 0 :(得分:3)

  

“MutationsRejectedException不允许我查看错误的实际原因。”

MutationsRejectedException可让您通过chained exceptions查看实际原因。 请注意构造函数中的“Throwable cause”。 版本1.7的代码;

try{
    //...
} catch (Exception e) {
    throw new MutationsRejectedException(null, null, (Map<TabletId,Set<SecurityErrorCode>>)null, null, 1, e);
}

try{
    //...
} catch (MutationsRejectedException e) {
    Throwable c = e.getCause();
    if(c instanceof MyException){
        //...
    }else{
        throw e;
    }
}

答案 1 :(得分:3)

MutationsRejectedException接口实际上涵盖了您的情况,期望您将其中的任何根本原因包装到其Exception中。这比宣布一般throws Exception要好得多,而异常翻译一直是推荐的Java习惯用法,因为版本1.3左右。

希望将throws Exception划掉作为反模式,你所拥有的所有选择都是在异常翻译和&#34;偷偷摸摸的&#34;之间进行的。成语。我相信你的偏好是前者,特别是考虑到后者与(...) while True: s.append(check_output(["./RFSniffer"])) (...) 非常相似,但更加模糊。