![](/img/trans.png)
[英]What Exception is thrown when an implementation breaks its interface's contract?
[英]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.