代码之家  ›  专栏  ›  技术社区  ›  Verma Aman

为什么Java有嵌套的try语句?

  •  1
  • Verma Aman  · 技术社区  · 6 年前

    我读到了关于嵌套的 try catch 语句,我不禁想知道使用嵌套 尝试 尝试 已经在外面了 尝试 ,如果要捕获异常,则外部 - 抓住 尝试 ?

    代码1:

    try 
    {
        Statement A;
        Statement B;
        try
        {
            Statement C;
            Statement D;
        }
        catch(CException e) { ... }
        catch(DException e) { ... }
    }
    catch(AException e) { ... }
    catch(BException e) { ... }
    

    代码2:

    try 
    {
        Statement A;
        Statement B;
    
        Statement C;
        Statement D;
    }
    catch(AException e) { ... }
    catch(BException e) { ... }
    catch(CException e) { ... }
    catch(DException e) { ... }
    

    3 回复  |  直到 6 年前
        1
  •  3
  •   k_ssb    6 年前

    您可以在内部try周围有一个循环,以便在不退出循环的情况下多次捕获异常。

    try {
        for (int i = 0; i < 10; i++) {
            try {
                someOperationThatOftenFails();
            } catch (SomeCommonException e) {
                ...
            }
        }
    } catch (SomeRareFatalException e) {
        ...
    }
    

    SomeCommonException SomeRareFatalException 在循环第一次出现时退出循环。

        2
  •  3
  •   Erwin Smout    6 年前

    是的,您碰巧给出的代码片段的行为恰好相同。现在考虑一下

    try 
    {
        Statement A;
        Statement B;
        try
        {
            Statement C;
            Statement D;
        }
        catch(CException e) { ... }
        catch(DException e) { ... }
    
        Statement E;
        Statement F;
    }
    catch(AException e) { ... }
    catch(BException e) { ... }
    

    无论C和D的结果如何,都要执行E和F。你打算怎么一试就做到(可能的答案是:在相关的catch块中复制E/F代码块。不太优雅。)

    这个 满的

        3
  •  1
  •   Mario Santini Imran Kedim    6 年前

    不完全是。

    如果在同一级别捕获异常,则当代码抛出第一条指令时,将无法执行其他指令。

    不是所有的例外都是一样的,你应该以一种特殊的方式对待每一个例外。

    其他时候,你不能继续,必须停下来。

    存在异常的原因是能够在适当的级别上处理错误。

    所以嵌套是有意义的 根据代码实现的逻辑块。

    我同意你应该避免写太多嵌套的异常块。

    但是,要解决这个问题,应该更好地设计代码,而不是仅仅使用一个大的 试一试 .

    这种方法很危险,因为要理解difficolt代码,因为当抛出异常时,您将很难弄清楚到底发生了什么。

    相反,您应该将代码分成更合理的单元,设计小方法、小类等等。