javascript中錯誤處理
由於js本身是動態語言,而且多年來一直沒有固定的開發工具,因此人們普遍認為他是一種難於除錯的程式語言。尤其是在指令碼出錯時,瀏覽器通常會給出類似於“object expected”(缺少物件)這樣的訊息,沒有上下文,讓人摸不著頭腦,後來便引入了try-catch和throw語句以及一些錯誤型別,讓開發人員能夠適當的處理錯誤。
(1.)try-catch語句
語法:
try{
//可能會導致錯誤的程式碼
}catch(error){
//在錯誤時該如何處理
}
也就是說,我們應該把又可能丟擲錯誤的程式碼都放在try語句塊中,而把那些用於處理錯誤的語句放在catch塊中,如:
try{
window.someNonexistentFunction();
}
catch(error)
{
alert("an error happened!");
}
如果try塊中的任何程式碼發生了錯誤,就會立即退出程式碼執行的過程,然後接著執行catch塊。此時,catch會接受到一個包含錯誤訊息的物件,然而這個錯誤訊息是必須給他起個名字的。這個物件中包含的實際資訊會因瀏覽器而不同,但是相同的是有一個儲存著錯誤訊息的message屬性,ECMA-262還規定一個儲存錯誤型別的name屬性;當前的所有瀏覽器都支援這個屬性。因此在發生錯誤時,就可以像下面這樣實事求是的顯示瀏覽器給出的資訊。
try
{
window.someNonexistentFunction();
}
catch(error)
{
alert(error.message);
}
這個message屬性是唯一一個能夠保證所有瀏覽器都支援的屬性,初次之外,IE,FIREFOX,SAFAIR CHROE以及opera都為物件添加了其餘相關資訊,IE添加了與message屬性完全相同的description屬性,還添加了儲存著內部錯誤數量的number屬性,FIREFOX添加了filename,linenumber和stack的屬性,SAFAIR添加了line(表示行號),sourceid(表示內部錯誤程式碼 )和sourceurl屬性。當然,在跨越瀏覽器程式設計時,最好還是隻使用message屬性。
(2).finally子句
雖說,try-catch是可選的,但是finally子句一經使用,其程式碼無論如何都是要執行的,也就是說無論try中的語句無論是錯誤還是正確,finally子句依舊執行,甚至return語句都不能阻止finally子句的執行。
如下:
try
{
return 2;
}
catch(error)
{
return 1;
} finally{
return 0;
}
該函式中,最終返回結果為0,若沒有finally則返回2,如果程式碼中包含finally語句,則無論是try還是catch中的語句都會被忽略,所以,在使用finally子句之前,一定要清楚自己想要程式碼做什麼。
(3).錯誤型別
在執行程式碼期間,每種錯誤都有對應的錯誤型別。
a. error:是基型別,其他錯誤型別都是繼承於該型別的。
b. evalerror:該型別的錯誤會在使用eval()函式而發生異常時被丟擲,如果沒把eval()當成函式呼叫,則就會丟擲錯誤。
c. rangerror::該型別的錯誤會在數值超出範圍時觸發。如:
var item1 = new array (-20) ; //會丟擲rangerror
var item2 = new arry(Number Max_value); //丟擲rangerror
d. referenceerror:通常在訪問不存在的變數時,就會發生這種錯誤,如:
var obj = j; //丟擲Referenceerror錯誤
e. syntaxerror :該語法是把js字元傳入eval()函式時,就會導致此類錯誤。如:
eval (" a + b"); // 丟擲syntaxerror 錯誤。
如果語法錯誤的程式碼出現在eval()之外,則不太可能使用syntaxerror。
f. typeerror :型別在js中經常會經常使用,是由於在執行特定於型別的操作時,變數的型別並不符合要求所致。如:
var 0 = new 10; //丟擲typeerror ;
alert (" name" + in true); //丟擲typeerror ;
function.prototype.tostring.call("name") ; //丟擲typeerror ;
g . urlerror :在使用encodeurl()或decodeurl(),而url格式不正確時,會導致urlerror錯誤。
由於encodeurl()其容錯性比較高,所以此類錯誤較少。
(3)丟擲錯誤throw
thorw操作符,是用於隨時丟擲自定義錯誤,切必須給throw指定一個值。
在遇到throw時,程式碼會立即停止執行,僅當有try-catch語句捕獲到被丟擲的值時,程式碼才會繼續執行。如:
try
{
var x=document.getElementById("demo").value;
if(x=="") throw "不能為空!";
if(isNaN(x)) throw "不為數字!";
if(x>10) throw "數字過大!";
if(x<5) throw "數字太小!";
}catch(error)
{
var y=document.getElementById("mess");
y.innerHTML="錯誤:"+error+".";
}
在建立自定義訊息時,最常見的錯誤型別是error,rangerror, referenceerror和 typeerror。另外,利用原生鏈還可以通過繼承error來建立自定義錯誤型別,此時需要為新建立的錯誤型別指定name和message屬性。如:
functioncustomerror (message ){
this.name = "customerror" ;
this .message = message;
customerror.prototype = new error();
throw new customerror( " my message");
}
瀏覽器對待繼承自error的自定義錯誤型別,就像對待其他錯誤型別一樣,如果要捕獲自己丟擲的錯誤並且把它與瀏覽器錯誤區別對待的話,建立自定義錯誤時非常有用的。
IE只有在丟擲error物件的時候才會顯示自定義錯誤訊息。對於其他型別,他都無一例外的顯示“ exception throw and not caught ”(丟擲了異常,且未被捕獲。)