我问一个简单的问题。在catch块之后有任何代码是不好的。即我们是否需要将它们包含在try中并在catch中重新抛出包装器异常?
我不是在询问最后的操作。
让我们举个例子。在这里doSomething()方法抛出一个名为'SomeException'的异常。
代码1:
try{
doSomething();
}catch(SomeException e){
throw new AnotherException(e);
}
doAnotherThing();
return someResult;
码2:
try{
doSomething();
doAnotherThing();
return someResult;
}catch(SomeException e){
throw new AnotherException(e);
}
在上面两个例子中,code2中有加号吗?
答案 0 :(得分:2)
如果doSomething()
没有发生异常,但doAnotherThing()
抛出SomeException
,则两种情况之间存在差异。
SomeException
将在代码中进一步提出。SomeException
将被catch块捕获并再次作为AnotherException
重新抛出。需要考虑的另一个案例是当catch块没有重新抛出异常时。
doAnotherThing()
因此,正如其他答案中已经说明的那样,每行有1个try-catch块可以使代码更清晰,避免出现意外行为。另一方面,当你有类似的东西时,我会考虑在同一个块中对多行进行分组
try {
doSomething(); // can throw SomeException
doAnotherThing();
doSomething(); // can throw SomeException as well
return someResult;
} catch(SomeException e) {
throw new AnotherException(e);
}
如果我们不关心是doSomething()
是第一次还是第二次调用异常,我们都不关心doAnotherThing()
是否被调用
答案 1 :(得分:1)
关于"坏"的判断我觉得主观。
我的偏好是每个方法一次try / catch,try中包含所有代码。
编译器不会阻止你在catch之后放置代码。我会在代码审查中引用你。
答案 2 :(得分:0)
样式2的一个问题是,你在try块中放入了更多的代码,它可以意外地捕获你不期望的异常,特别是当它是一个相当高级别的异常或运行时例外。假设您正在尝试将字符串转换为数字并捕获可能的NumberFormatException。因此,假设样式2,您之后使用DoAnotherThing执行更多代码。也许你甚至打电话给图书馆。现在这个库引发了同样的异常,但你正在处理它,就像它来自你自己的代码一样。
出于这个原因,我更喜欢小的try / catch块,除非我真的确定下面的其余代码。但是,当然这很大程度上取决于你实际捕获的异常(来自图书馆的一个自定义的,你在那里打电话显然不会被抛到其他地方)以及代码的可读性等等。 / p>