我的模块中有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();
}
答案 0 :(得分:2)
真的取决于你需要实现的目标。
情况可能足够灵活,允许您处理特定模块中出现的异常。例如,您有一些队列元素的进程,抛出异常,在您的异常处理代码中,您只需再试一次。调用者知道调用方法时会添加一些内容,但不需要知道何时/如何。
另一方面,如果出现问题,情况可能会要求您立即通知来电者。以上面的例子为例,调用者可能需要知道排队是否成功,以便他们可以相应地指导用户。
在某些情况下,尽管建议,但是冒出异常需要以这样的方式完成,即内部异常不会泄露给调用者,因为它可能暴露模块的内部结构,这可能存在安全风险
通常,人们所做的是,在必要时,异常包含在自定义异常中。如果发生任何错误,则使用自定义异常来冒泡错误。然后由调用者决定如果/何时发生错误该怎么做。
答案 1 :(得分:0)
重新抛出或处理取决于调用者是否可以合理地处理异常。
E.g。如果UI通过方法链触发计算,则此链中某处异常丢失可能是不合理的,因为将ui中的异常呈现给用户是有意义的。
因此,它主要取决于哪种情况更适合上下文。
经验法则是:但是可以合理地处理异常
答案 2 :(得分:0)
这取决于您希望通过什么实现,以及您希望处理异常的位置。如果您可以在methodA1()
内正确处理异常,那么它将更容易使用该方法(方法调用不需要try-catch)
如果你不能在方法本身处理异常(例如,没有足够的信息来正确处理异常),你只能在methodB1
中正确处理它,那么你应该使用SCENARIO 2