1. 程式人生 > >javascript中錯誤處理

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(err
or)
  {
    var y=document.getElementById("mess");
    y.innerHTML="錯誤:"+err
or
+".";
  }

在建立自定義訊息時,最常見的錯誤型別是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 ”(丟擲了異常,且未被捕獲。)