繁体   English   中英

是否需要在实现中抛出检查异常,但接口没有抛出该异常?

[英]Need to throw checked exception in implementation, but it's not thrown by the interface?

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

现在,我可以捕获已检查的异常,并直接在其位置抛出另一个异常:未检查的异常(如某些RuntimeException或MutationsRejectedException)。 这两个选项似乎都不是很好-未检查的异常是我想在抛出MutationsRejectedException时实际上要抛出的异常的不良模拟,因此我无法查看错误的实际原因。

最佳做法是什么?

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

是的。MutationsRejectedException将允许您通过链接的异常查看实际原因。 注意构造函数中的“ Throwable原因”。 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;
    }
}

BatchWriter接口实际上希望您包装任何导致其MutationsRejectedException根本原因,从而完全满足您的情况。 与声明常规Exception相比,这是更好的设计,并且从1.3左右版本开始,就建议将Java习惯用法翻译为异常转换。

希望使用throws Exception作为一种反模式,您所拥有的所有选择都在异常转换和“偷偷摸摸的”成语之间。 我相信您更喜欢前者,尤其是考虑到后者与throws Exception非常相似,但是更加晦涩。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM