2008年12月4日

try, throw, catch, finally

  1. try 用來指定一個指令集的區塊,如果有拋出異常時,可以直接跳離區塊。這在指令集很複雜時,可以簡化跳離區塊的方法。有一次筆者用 if else 寫了一段很複雜的程序,其中有很多終止條件,跳出來後還要收尾,不同終止原因,有不同的處理。之後我又改用 try 來寫,結果真的簡化很多。很類似 for 迴圈中的 break,但更好用。其基本語法是:

    try { 指令集1 } catch( 變數 ) { 指令集2 }

    上面的區塊 { } 是必須的,沒加上會失敗。當 try 指定的區塊中有指令拋出異常(也包括此區塊呼用的函式所拋出的異常),原有的執行會被中斷,直接跳到 catch 所指定的區塊,執行其中的指令。catch 中可以宣告變數,用來儲存拋出的異常訊息。如果 try 的指令集都沒有拋出異常,則會跳過 catch 區塊的指令集。

    • 上例中沒有拋出異常,所以沒有執行 catch 區塊的指令。

  2. throw 用來拋出程式師定義的異常訊息。其語法是:

    throw 計算式;

  3. throw 可拋出物件

  4. finally 可以接在 try 區塊之後,也可以接在 catch 之後。try 之後,至少要接一個 catch 或 finally,不可空白。不論是否拋出異常,finally 區塊都會被執行。其語法是:

    try { } finally { }

    try { } catch ( ) { } finally { }

    finally 不可放在 catch 之前,否則會失敗。

  5. catch 接到異常訊息後可以再拋出,這可用在多層巢的 try。

  6. 如果內層的 try 區塊,沒有宣告 catch 區塊,則其拋出的異常,會由外層的 catch 區塊承接。

  7. catch 子句中可以加 if 條件式,只有條件式為 true,才會執行指定的指令區塊。條件式 catch 可接多個。有加 if 的 catch 之後,可以再加一個 catch 區塊。無條件式 catch 區塊必須放在最後面,且只能有一個。其語法是:

    try { } catch( 變數 if 條件式) {} [catch( 變數 ) {}]

    條件式 catch 只有 Firefox 可執行;IE, Safari, Chrome 都沒有支援。


©2008-2009 by ant2legs, All Rights Reserved. ant2legs 擁有其製作的文章,圖片與程式的著作權,所有權利保留。