Praxis 16. 理解異常處理的執行流程

Exception 的 control flow

Java 的異常控制是有助於協助程式處理異常狀況的發生,儘管這些年來在 Checked Exception 和 Unchecked Exception 上有很多的討論,在各種設計上都建議減少 Checked Exception.
但 Java 所設計的 Exception 對於異常狀況的發生,還是對程式的強健性 (Robust) 是有一定程度的提升。

在 Java 裡一旦發生 Exception ,程式的流程會往下列三個地方移動:

  • Catch block
  • finally block
  • calling method

這樣的情形下,就發生了討厭的 Goto 行為(程式執行流程跳來跳去),增加程式除錯的難度。

難以猜測程式執行流程

1
2
3
4
5
6
7
8
9
10
11
12
13
public void m3(boolean isThrow){
System.out.println("Enter m3");
try{
Button b3 = new Button();
if(isThrow){
throw new IOException();
}
} finally {
System.out.println("Enter m3 Finllay"); // 1
}
System.out.println("Exist m3"); // 2

}

上面的程式碼,呈現一個簡單的 try catch 情境,這個 try 並沒有 catch 只有 finally 區塊,而在 finally 區塊結束一行,再加上一行 Print 。

執行結果為:

1
2
Enter m3 
Enter m3 Finally

也就是說最行一行的 Exist m3 並沒有被執行,在執行完 finally 後,就離開了。

Try Catch 的執行原則

  • 如果同時存在 catch block 以及 finally block ,一旦產生異常會先執行 catch block ,再執行 finally block,如果沒有 catch block 就會直接執行 finally block
  • 如果沒有 catch block ,無論異常是否發生都會執行 finally block
  • 如果異常發生,沒有被 catch ,無論是否執行 finally, 之後的 statement 將不被執行。