【问题标题】:Replacing generic exceptions with more specific exception types?用更具体的异常类型替换通用异常?
【发布时间】:2016-05-11 16:00:15
【问题描述】:

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

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() 的签名,但他们也不想只捕获任何 RuntimeException A 类,因为他们不想捕获任何类型的 RuntimeException - 只有我们从 B 类中排除的那些。

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

【问题讨论】:

  • RuntimeExeptions 更改为更具体的内容。如果需要,创建自定义类。
  • 我是否理解正确:您应该捕获 RuntimeExceptions,但前提是它们在 java 代码中使用“throw new RuntimeException()”显式抛出,同时忽略可能来自某个地方的那些还有吗?
  • 修改B类是一种选择吗?
  • 感谢您的建议。回答 911DidBush 和 slambeth: * 基本上,如果除了我们期望的异常(InterruptedException 或如果我们由于 if 条件而抛出一个异常)之外还抛出任何其他异常,我们不应该在 A 类中捕获它。 * B 类可以可以修改,但不能签名

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


【解决方案1】:

假设你的callSomeMethod的签名中包含throws Exception,并且不能更改:将方法中的RuntimeExceptions更改为自定义的Exception类,然后在A类中:

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

这有点傻,但如果您无法更改方法签名,则可能是必要的。 (如果您可以更改它,您可以直接捕获CustomException。)您甚至可以在记录器中创建一个采用Exception 的方法,检查它是什么类型,并采取相应的行动。然后只需在需要编辑的每个 catch 语句中使用此方法即可。

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

【讨论】:

    【解决方案2】:

    如果您在 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异常。

    希望这能解决您的问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2021-02-02
      • 2017-11-23
      相关资源
      最近更新 更多