用更具体的异常类型替换泛型异常?

时间:2016-05-11 16:00:15

标签: java exception try-catch runtimeexception unchecked-exception

对于我一直在努力的项目,我们有一些看起来像这样的块:

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类之外的那些。

处理此问题的最佳方法是什么?

2 个答案:

答案 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异常。

希望这能解决你的问题!!