簡體   English   中英

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

[英]Embedding try-catch blocks within try-catch blocks in Java

假設我有方法a()和方法b(),它們都可能拋出異常。 在我的計划中,有一種情況我必須至少打電話給其中一個; 我稱之為無關緊要。 但是,如果其中一個拋出異常,我必須調用另一個異常。 如果他們都拋出異常,我不需要做任何事情。

我在考慮做這樣的事情:

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

    }
}

但我認為如果我有兩種以上的方法可以調用,這將是不切實際的。 所以我想知道是否有更優雅或更好的方式來做我想做的事情。

您可以

    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
}

您可以在每個案例之后返回,以便在第一次成功之后返回。

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();
}

在如此普遍性的水平上討論實用選項很困難,但你可以這樣做:

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

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

但是,它們是否更“優雅”......或者更具可讀性......將高度依賴於環境。 而且還依賴於讀者。 (作為一名經驗豐富的Java程序員,我對理解嵌套異常沒有任何困難。根據我的經驗, 旨在避免嵌套的人工構造可能會導致代碼難以閱讀/理解。)


我希望你是不是真的要趕上Exception ......“因為如果你是,那是不是比try / catch語句的嵌套一個糟糕的問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM