Java结构 - 是否有必要嵌套try语句?

4

我刚刚在考虑这个问题,虽然这是可能的,但我想知道它是否被认为是“不良做法”。我认为是的,但我想征求意见以检查我的观点。

像这样做是否有问题:

try{
    something();
    somethingelse();
        try{
            foo();
            bar();
        }catch(Exception e){
            e.printStackTrace();
        }
    somethingelseagain();
}catch(Exception e){
     e.printStackTrace();
}

我认为没有必要这样做,因为任何抛出异常的东西都会触发第一个catch。欢迎提出您的看法。

1
捕获异常不好,嵌套try/catch更不好。尽管如此,嵌套的try/catch几乎总是意味着你应该进行重构。 - Dave Newton
1
除非 somethingsomethingelsesomethingelseagain 抛出异常,否则它们不会被内部 catch 块捕获。 - Philip Kendall
嵌套的 try/catch 块通常最好被提取到它们自己的私有方法中。然而,如果您在可能抛出异常的位置尽可能缩小 try 块的范围,则通常不需要这样做。 - Cory Kendall
3个回答

4
在你的例子中,内部catch有点多余。
然而,嵌套的catch在以下情况下会更有用:
- 捕获不同的异常 - 在两个catch的处理程序块中执行不同的操作 - 内部catch可能捕获异常、执行某些操作,然后重新抛出相同的异常,外部catch块可以捕获该异常
另外,不要忘记finally块的潜在用途,即使捕获了异常,也可以执行清理代码。
通常应尽可能捕获最明确类型(即特定)的异常。
异常主题很有趣,也不乏争议

这是一个很好的答案,但我想问的是...如果你想捕获不同的异常,那么你肯定会在一个try块中有多个catch语句。 - ThePerson
1
是的,如果这能捕获您想要的行为,那么它肯定比嵌套好。 - occulus
嗨,NutterzUK,如果您觉得我的回答有用,您会考虑接受它吗?干杯! - occulus

1
我认为你可能需要嵌套尝试语句的情况是,如果你在catch中请求用户输入,并且该输入可能无效。

0

当情况需要时,嵌套的try-catch是完全合理的。例如,如果某个方法抛出了某个异常,您不希望跳过任何步骤并退出主要的try。如果它抛出任何其他异常,则希望正常行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接