在Java中的try-catch块中嵌入try-catch块

时间:2012-10-28 23:10:33

标签: java exception-handling

假设我有方法a()和方法b(),它们都可能抛出异常。在我的计划中,有一种情况我必须至少打电话给其中一个;我称之为无关紧要。但是,如果其中一个抛出异常,我必须调用另一个异常。如果他们都抛出异常,我不需要做任何事情。

我在考虑做这样的事情:

try {
    a();
catch (Exception e) {
    try {
        b();
    catch (Exception e) {

    }
}

但我认为如果我有两种以上的方法可以调用,那将是不切实际的。所以我想知道是否有一种更优雅或更好的方式来做我想做的事情。

3 个答案:

答案 0 :(得分:2)

你可以

    abc:
    {
        try
        {
            a();
            break abc;
        }
        catch(Exception e){}

        try
        {
            b();
            break abc;
        }
        catch(Exception e){}

        try
        {
            c();
            break abc;
        }
        catch(Exception e){}

    }

如果链条更长,可能更好

for(int i=0; i<4; i++)
{
    try 
    {
        switch(i)
        {
            case 0: a(); break;
            case 1: b(); break;
            case 2: c(); break;
            case 3: d(); break;
        }
    }
    catch(Exception e){} // next
}

答案 1 :(得分:2)

您可以在每个案例之后返回,这样在第一次成功之后,将返回一个返回。

public void uponSuccessStop() {
    try {
        a();
        return;
    } catch (Exception e) {}
    try {
        b();
        return;
    } catch (Exception e) {}
    try {
        c();
        return;
    } catch (Exception e) {}
}

另一种选择是抛弃异常,并使用短路布尔逻辑:

public boolean tryA() {
    try {
        a();
        return true;
    } catch (Exception e) {
        return false;
    }
}
// repeat for B and C

public void uponSuccessStop() {
    boolean succeeded = tryA() || tryB() || tryC();
}

答案 2 :(得分:0)

在如此普遍的水平上讨论实际选择很困难,但你可以这样做:

boolean succeeded = false;
try {
    a();
    succeeded = true;
} catch (Exception e) {
    // intentional ...
}
if (not succeeded) {
    try {
        b();
    catch (Exception e) {
        ...
    }
}

...以及使用条件(或breakreturn)以避免嵌套的所有其他安排。

但是,它们是否更“优雅”......或者更具可读性......将依赖于背景。而且还依赖于读者。 (作为一名经验丰富的Java程序员,我对理解嵌套异常没有任何困难。根据我的经验,旨在以避免嵌套的人工构造可能导致更难的代码被读取/明白。)


我希望你不是真的要抓住Exception ...'cos,如果你是,这是一个很多更糟糕的问题而不是嵌套of try / catch !!