我实现了Accumulo BatchWriter接口,以便在插入之前对记录执行一些额外的计算。如果出现问题,该计算可能会抛出一个已检查的异常,但BatchWriter抛出的唯一异常是MutationsRejectedException。因此,当I尝试进行预处理时发生错误时,我无法抛出必要的已检查异常。
现在,我可以捕获已检查的异常并简单地在其位置抛出另一个异常:一个未经检查的异常,如某些RuntimeException或MutationsRejectedException。这两个选项看起来都不是很好 - 一个未经检查的异常是一个很差的模拟异常,我想在抛出MutationsRejectedException时实际抛出它并不能让我看到错误的实际原因。
这里的最佳做法是什么?
答案 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"]))
(...)
非常相似,但更加模糊。