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