- try 用來指定一個指令集的區塊,如果有拋出異常時,可以直接跳離區塊。這在指令集很複雜時,可以簡化跳離區塊的方法。有一次筆者用 if else 寫了一段很複雜的程序,其中有很多終止條件,跳出來後還要收尾,不同終止原因,有不同的處理。之後我又改用 try 來寫,結果真的簡化很多。很類似 for 迴圈中的 break,但更好用。其基本語法是:
try { 指令集1 } catch( 變數 ) { 指令集2 }
上面的區塊 { } 是必須的,沒加上會失敗。當 try 指定的區塊中有指令拋出異常(也包括此區塊呼用的函式所拋出的異常),原有的執行會被中斷,直接跳到 catch 所指定的區塊,執行其中的指令。catch 中可以宣告變數,用來儲存拋出的異常訊息。如果 try 的指令集都沒有拋出異常,則會跳過 catch 區塊的指令集。
- 上例中沒有拋出異常,所以沒有執行 catch 區塊的指令。
- throw 用來拋出程式師定義的異常訊息。其語法是:
throw 計算式;
- throw 可拋出物件。
- finally 可以接在 try 區塊之後,也可以接在 catch 之後。try 之後,至少要接一個 catch 或 finally,不可空白。不論是否拋出異常,finally 區塊都會被執行。其語法是:
try { } finally { }
try { } catch ( ) { } finally { }
finally 不可放在 catch 之前,否則會失敗。
- catch 接到異常訊息後可以再拋出,這可用在多層巢的 try。
- 如果內層的 try 區塊,沒有宣告 catch 區塊,則其拋出的異常,會由外層的 catch 區塊承接。
- catch 子句中可以加 if 條件式,只有條件式為 true,才會執行指定的指令區塊。條件式 catch 可接多個。有加 if 的 catch 之後,可以再加一個 catch 區塊。無條件式 catch 區塊必須放在最後面,且只能有一個。其語法是:
try { } catch( 變數 if 條件式) {} [catch( 變數 ) {}]
條件式 catch 只有 Firefox 可執行;IE, Safari, Chrome 都沒有支援。