2012-10-28 141 views
1

假設我有方法a()和方法b(),它們都可能引發異常。在我的計劃中,有一種情況是我必須打電話給他們中的至少一個;我打電話並不重要。但是,如果其中一個引發異常,我必須調用另一個。如果他們都拋出異常,我不需要做任何事情。在Java中的try-catch塊中嵌入try-catch塊

我的想法做這樣的:

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

    } 
} 

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

+2

你能提供一個更具體的用例嗎? – NullUserException

+1

也許你的代碼設計有問題。這不是人們通常使用例外的方式。 – ignis

+0

我很抱歉,我不能更具體地說它,因爲它涉及到學校項目。儘管謝謝您的幫助!伊格尼斯,我想你可能是對的;我想我正在考慮以錯誤的方式來解決問題,並且我會嘗試以另一種方式來解決問題! – CowZow

回答

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

+1,因爲我以前沒見過這個。值得考慮作爲一種選擇。 – Bohemian

+0

這看起來很類似goto。 – NullUserException

+0

@NullUserException更像是一個返回 – irreputable

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