1

假设我有方法 a() 和方法 b() 都可能引发异常。在我的程序中,有一种情况我必须至少调用其中一个;我打电话给哪个都没关系。但是,如果其中一个抛出异常,我必须调用另一个。如果他们都抛出异常,我不需要做任何事情。

我正在考虑做这样的事情:

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

    }
}

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

4

3 回答 3

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
}
于 2012-10-28T23:15:24.010 回答
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();
}
于 2012-10-28T23:15:43.227 回答
0

很难在如此笼统的层面上讨论实际的选择,但你可以这样做:

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

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

但是它们是否更“优雅”......或者更具可读性......将高度依赖于上下文。并且还依赖于读者。(作为一名经验丰富的 Java 程序员,我可以毫无困难地理解嵌套异常。根据我的经验,旨在避免嵌套的人为构造可能会导致代码难以阅读/理解。)


我希望你不会真的去捕捉Exception......因为如果你捕捉到了,那是一个比 try / catch 嵌套更糟糕的问题

于 2012-10-28T23:16:41.180 回答