可能重复:
Should java try blocks be scoped as tightly as possible?
是否有任何性能优势(特别是在C ++或Java中)保持try块的大小很小[除了它为读者提供更多信息,因为哪个语句可以抛出]。
给出以下方法,我不想抛弃该方法。
void function() throws Exception
{
statement1
statement2
statement3 // can throw
statement4
statement5
}
这样做会更好:
选项1
void function()
{
try {
statement1
statement2
statement3 // can throw
statement4
statement5
}
catch (...) {
}
}
或
选项2
void function()
{
statement1
statement2
boolean success = false;
try {
statement3 // can throw
success = true;
}
catch (...) {
}
if (success)
{
statement4
statement5
}
}
答案 0 :(得分:3)
至少在我看过的编译器和异常处理机制中,应该没有区别。嵌套异常抛出的深度可能会有所不同,但只有在抛出异常并且一般协议是在这种情况下,性能是您通常可以忽略的。
答案 1 :(得分:2)
我没有解决性能问题,我认为可读性更重要,除非你知道自己有瓶颈。话虽如此:
这实际上取决于相关声明1-5的含义。如果是一个以5个步骤执行的逻辑操作,我更喜欢选项1。
在选项2的try块结尾处设置成功标志是非常难看且容易出错的,我不会在任何情况下推荐这个。
答案 2 :(得分:1)
选项1没问题。事实上,一些线路不投掷是不相关的。首先看看代码,它看起来更清晰。没有打击
然而,你会听到关于不分青红皂白地吃掉所有例外并忽略它们的讲座这是从使用异常(甚至包含异常)的代码层转换而不是使用异常的层时获得的不匹配类型。看来您上面的图层不喜欢异常,而下面的图层也是如此。您上面的图层是否有理由不喜欢异常。如果你需要向上面的层解释为什么statement3失败会发生什么。那你必须写一个可怕的异常来返回代码转换函数。
答案 3 :(得分:1)
正如其他人所说,这些案例之间生成的代码应该只有很小的差别。异常处理的“成本”涉及在堆栈展开时必须销毁多少临时对象(并且在较小程度上,代码必须跳转到的位置数量)。这会随着堆栈的深度而扩展 - 抛出异常和捕获异常之间的函数调用次数 - 而不是try块开始和throw之间执行的指令数。