【问题标题】:Good Practice : Exception Handling良好实践:异常处理
【发布时间】:2015-10-26 08:08:42
【问题描述】:

我的模块中有 2 个类,其中一个类说 A 类具有可以抛出 InterruptedException、NoSuchElementException 的方法,另一个类说 B 类具有从 A 类调用方法的方法。 有人可以指导我实施异常处理的好习惯吗?应该是 CASE 1 还是 CASE 2 或任何其他方式。

案例 1::

A 类

methodA1 throws InterruptedException, NoSuchElementException {...}
methodA2 throws InterruptedException, NoSuchElementException {...}
.
.
.
.
methodA10 throws InterruptedException, NoSuchElementException {...}

B 类

a = new A();
methodB1 {
    try{
       a.methodA1();
       a.methodA2();
    }
    catch(InterruptedException){
        //do something
    }
    catch(NoSuchElementException){
        //do something else
    }
}
methodB2 {
    try{
        a.methodA9();
        a.methodA10();
    }
    catch(InterruptedException){
        //do something
    }
    catch(NoSuchElementException){
        //do something else
    }
}

场景 2::

A 类

methodA1 {
   try{
    //perform actions
   }
   catch(InterruptedException){
    //do something
   }
   catch(NoSuchElementException){
    //do something else
   }  
}
.
.
.
.
methodA10 {
   try{
    //perform actions
   }
   catch(InterruptedException){
    //do something
   }
   catch(NoSuchElementException){
    //do something else
   } 
 }

B 类

a = new A();
methodB1 {
   a.methodA1();
   a.methodA2();
}
methodB2 {
   a.methodA1();
   a.methodA2();
}

【问题讨论】:

  • 这取决于从您的代码的角度来看,在 A 类或 B 类中处理这些异常是否更有意义。您是否希望它成为可能发生这些问题的方法接口的一部分以及客户端需要处理它们,还是您可以在内部合理地处理它们而让客户无所适从?

标签: java exception exception-handling


【解决方案1】:

真的取决于你需要实现什么。

这种情况可能足够灵活,可以让您处理特定模块中出现的异常。例如,您有一些将元素排队的进程,抛出异常并且在您的异常处理代码中,您只需再试一次。调用者知道当方法被调用时,会添加一些东西,但不需要通知何时/如何。

另一方面,这种情况可能需要您在发生某些事情时立即通知来电者。以上面的例子为例,调用者可能需要知道排队是否成功,以便他们可以相应地引导用户。

在某些情况下,尽管建议使用冒泡异常,但需要以不向调用者泄露内部异常的方式完成,因为它可能会暴露模块的内部结构,这可能是一个安全风险.

通常情况下,需要在自定义异常中封装异常。如果发生任何错误,则使用自定义异常来冒泡错误。然后由调用者决定如果/当发生错误时该怎么做。

【讨论】:

    【解决方案2】:

    重新抛出或处理取决于调用者是否能合理处理异常。

    例如如果 UI 通过方法链触发计算,则在此链中的某个位置丢失异常可能是不合理的,因为在 UI 中向用户呈现异常会很有意义。

    所以这主要取决于哪个场景更可取。

    经验法则是:但是能合理处理异常就应该这样做

    【讨论】:

      【解决方案3】:

      这取决于您想要实现的目标以及您想要处理异常的位置。如果您可以在 methodA1() 中正确处理异常,则使用该方法会更容易(在方法调用周围不需要 try-catch)

      如果您无法在方法本身中处理异常(例如,没有足够的信息来正确处理异常)并且您只能在 methodB1 中正确处理它,那么您应该使用 SCENARIO 2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 2012-09-20
        • 2010-09-14
        • 2012-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多