0

对于一个项目,我一直在工作,我们有一些块看起来像这样的:用更具体的异常类型替换泛型异常?

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"); 
} 

理想的情况下,我集团一直叫我改变,因为越好,我不能改变callSomeMethod()的签名,但他们也不希望只捕获A类中的任何RuntimeException,因为他们不想仅捕获任何类型的RuntimeException - 仅限于B类除外。

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

+2

将这些“RuntimeExeption”更改为更具体的内容。根据需要创建自定义类。 –

+0

我理解这是否正确:你应该捕获RuntimeExceptions,但只有当他们明确地被抛出到Java代码中的类B中,抛出新的RuntimeException(),而忽略可能来自其他地方的那些呢? –

+0

正在修改B类选项吗? – slambeth

回答

0

假设你callSomeMethod的签名包含throws Exception,你不能改变它:在方法更改RuntimeException s到自定义Exception类,然后在A类:

try { 
    callSomeMethod(); 
} 
catch (Exception e) { 
    if(e instanceof CustomException) 
     //Log it or something, for metrics? 
} 

这是有点傻,但如果你不能改变方法签名可能是必要的。 (如果你可以改变它,你可以直接抓住CustomException。)你甚至可以在你的记录器中制作一个方法,它会检查它是什么类型,并相应地执行。然后在每个需要编辑的catch语句中使用这个方法。

在设计此解决方案时,请记住RuntimeException不需要被捕获。它可以为您节省一些麻烦。

0

如果chnage在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例外。

希望能解决您的问题!