对于我一直在努力的项目,我们有一些看起来像这样的块:
A类:
try {
callSomeMethod();
}
catch (Exception e) {
throw new SomeCustomExceptionTypeForMetrics("");
}
但是,我的任务是更换所有我们捕获通用异常的实例,只有特定的"预期"例外类型。
问题是callSomeMethod()有这样的东西
B组:
try {
if (someCondition...) {
}
else {
//failed
throw new RuntimeException("Timeout while waiting for results")
}
}
catch(InterruptedException e) {
// do some failure stuff here
throw new RuntimeException("Something here");
}
理想情况下,我的小组要求我更改 little ,我无法更改callSomeMethod()的签名,但他们也不想只是捕获A类中的任何RuntimeException,因为他们不想捕获任何类型的RuntimeException - 只有我们除了B类之外的那些。
处理此问题的最佳方法是什么?
答案 0 :(得分:0)
假设您的callSomeMethod
签名包含throws Exception
,并且您无法更改它:将方法中的RuntimeException
更改为自定义Exception
类,然后在A组:
try {
callSomeMethod();
}
catch (Exception e) {
if(e instanceof CustomException)
//Log it or something, for metrics?
}
这有点愚蠢,但如果你不能改变方法签名可能是必要的。 (如果你可以改变它,你可以直接捕获CustomException
。)你甚至可以在你的记录器中创建一个带Exception
的方法,检查它是什么类型,并采取相应的行动。然后在每个需要编辑的catch语句中使用此方法。
在设计此解决方案时,请记住不需要捕获RuntimeException
。它可以为你省去一些麻烦。
答案 1 :(得分:0)
如果您按照以下方式在B类中填写代码
try {
if (someCondition...) {
}
else {
//failed
throw new MyRuntimeException("Timeout while waiting for results")
}
}
catch(InterruptedException e) {
// do some failure stuff here
throw new MyRuntimeException("Something here");
}
并将MyRuntimeException定义为:
class MyRuntimeException extends RuntimeException{
..
}
在A类中,您只需要捕获MyRuntimeException异常。
希望这能解决你的问题!!