限制尝试块范围。有关系吗?

时间:2010-01-22 19:04:38

标签: java c++ performance try-catch

  

可能重复:
  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
    }
}

4 个答案:

答案 0 :(得分:3)

至少在我看过的编译器和异常处理机制中,应该没有区别。嵌套异常抛出的深度可能会有所不同,但只有在抛出异常并且一般协议是在这种情况下,性能是您通常可以忽略的。

答案 1 :(得分:2)

我没有解决性能问题,我认为可读性更重要,除非你知道自己有瓶颈。话虽如此:

这实际上取决于相关声明1-5的含义。如果是一个以5个步骤执行的逻辑操作,我更喜欢选项1。

在选项2的try块结尾处设置成功标志是非常难看且容易出错的,我不会在任何情况下推荐这个。

答案 2 :(得分:1)

选项1没问题。事实上,一些线路不投掷是不相关的。首先看看代码,它看起来更清晰。没有打击

然而,你会听到关于不分青红皂白地吃掉所有例外并忽略它们的讲座

这是从使用异常(甚至包含异常)的代码层转换而不是使用异常的层时获得的不匹配类型。看来您上面的图层不喜欢异常,而下面的图层也是如此。您上面的图层是否有理由不喜欢异常。如果你需要向上面的层解释为什么statement3失败会发生什么。那你必须写一个可怕的异常来返回代码转换函数。

答案 3 :(得分:1)

正如其他人所说,这些案例之间生成的代码应该只有很小的差别。异常处理的“成本”涉及在堆栈展开时必须销毁多少临时对象(并且在较小程度上,代码必须跳转到的位置数量)。这会随着堆栈的深度而扩展 - 抛出异常和捕获异常之间的函数调用次数 - 而不是try块开始和throw之间执行的指令数。