2017-04-12 110 views
3

如果我在一個拋出異常的函數中有多個函數,如果它們互相依賴,那麼處理它們的最佳方法是什麼?多個異常拋出函數的異常處理實踐

相互依賴,我的意思是,如果拋出一個異常,拋出異常的函數之後的代碼應該被跳過。

我想通了三種方式來做到這一點:

異常嵌套

public void parent() { 
    someFunction(); 
} 

public void someFunction() { 
    try { 
     function1(); 
     try { 
      function2(); 
      ... 
     } catch (Func2xception e) { 
      System.out.println("Function 2 failed!"); 
     } 
    } catch (Func1Exception e) { 
     System.out.println("Function 1 failed!"); 
    } 
} 

回報例外

public void parent() { 
    someFunction(); 
} 

public void someFunction() { 
    try { 
     function1(); 
    } catch (Func1Exception e) { 
     System.out.println("Function 1 failed!"); 
     return; 
    } 

    try { 
     function2(); 
    } catch (Func2xception e) { 
     System.out.println("Function 2 failed!"); 
     return; 
    } 

    ... 
} 

添加例外方法簽名

public void parent() { 
    try { 
     someFunction(); 
    } catch (Func1Exception e) { 
     System.out.println("Function 1 failed!"); 
    } catch (Func2Exception e) { 
     System.out.println("Function 2 failed!"); 
    } ... 
} 

public void someFunction() throws Func1Exception, Func2Exception { 
    function1(); 
    function2(); 
    ... 
} 

我有時會把它們全部用在一起,這是一團糟。有沒有關於如何處理這種情況的良好做法?

回答

3

使用的方式取決於是否異常應該由someFunction()方法,否則抓到的客戶端來處理,一旦它們發生處理,也就是someFunction()方法內。

例外嵌套案例,嵌套不是必需的。
您可以使用單個try語句,並將可能生成異常的兩個調用放在其中。
如果在兩個被調用的方法之一中發生異常,則可以在catch語句之一中完成,因此只有在第一個方法沒有引發捕獲的異常時才執行第二個方法。 它產生的結果與您的代碼完全相同,但只有一個try,且沒有可讀性較差的嵌套。

public void someFunction() { 
    try { 
     function1();  
     function2(); 
      ...  
    } catch (Func1Exception e) { 
     System.out.println("Function 1 failed!"); 
    } 
    catch (Func2xception e) { 
     System.out.println("Function 2 failed!"); 
    }  
} 

做的這種方式是合適的,如果你有catch語句後其他一些指示,你希望他們即使預期的例外之一被抓執行。

返回異常情況顯示出足夠接近的問題。
它可以與單個try進行重構:

public void someFunction() { 
     try { 
      function1();  
      function2(); 
       ...  
     } catch (Func1Exception e) { 
      System.out.println("Function 1 failed!"); 
      return; 
     } 
     catch (Func2xception e) { 
      System.out.println("Function 2 failed!"); 
      return; 
     }  
    } 
    ... 
} 

做的這種方式是合適的,如果你有catch報表後一些其它指令,你不希望他們被執行,如果預期的一個例外被捕獲。

不過對於這兩種情況,如果異常處理是兩個例外(Func1ExceptionFunc2xception)在一個單一的catch語句,你可以將它們分組相同:

public void someFunction() { 
    try { 
     function1();  
     function2(); 
      ...  
    } 
    catch (Func1Exception | Func2xception e) { 
     System.out.println("Function 1 or 2 failed!"); 
    } 
} 

最後,只有當方法的客戶端應該處理異常時,方法簽名情況下才會添加例外

1

你可以在一個catch子句中捕獲多個異常,我相信從Java 7開始。

try { 
    ... 
} catch(IOException | IllegalArgumentException | SomeOtherException e) { 
    ... 
}