良好实践:异常处理

时间:2015-10-26 08:08:42

标签: java exception exception-handling

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

CASE 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();
}

3 个答案:

答案 0 :(得分:2)

真的取决于你需要实现的目标。

情况可能足够灵活,允许您处理特定模块中出现的异常。例如,您有一些队列元素的进程,抛出异常,在您的异常处理代码中,您只需再试一次。调用者知道调用方法时会添加一些内容,但不需要知道何时/如何。

另一方面,如果出现问题,情况可能会要求您立即通知来电者。以上面的例子为例,调用者可能需要知道排队是否成功,以便他们可以相应地指导用户。

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

通常,人们所做的是,在必要时,异常包含在自定义异常中。如果发生任何错误,则使用自定义异常来冒泡错误。然后由调用者决定如果/何时发生错误该怎么做。

答案 1 :(得分:0)

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

E.g。如果UI通过方法链触发计算,则此链中某处异常丢失可能是不合理的,因为将ui中的异常呈现给用户是有意义的。

因此,它主要取决于哪种情况更适合上下文。

经验法则是:但是可以合理地处理异常

答案 2 :(得分:0)

这取决于您希望通过什么实现,以及您希望处理异常的位置。如果您可以在methodA1()内正确处理异常,那么它将更容易使用该方法(方法调用不需要try-catch)

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

相关问题