欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript高級程序設(shè)計 閱讀筆記(二十) js錯誤處理

 更新時間:2012年08月14日 16:52:21   作者:  
語法錯誤,也稱解析錯誤,發(fā)生在傳統(tǒng)語言的編譯時,在JavaScript中發(fā)生在解釋時,運(yùn)行時錯誤也稱為異常(exception,在編譯期/解釋器后)
一、錯誤分類

  1、語法錯誤:也稱解析錯誤,發(fā)生在傳統(tǒng)語言的編譯時,在JavaScript中發(fā)生在解釋時。這些錯誤是由代碼中的意外字符直接引起的,然后就不能直接編譯/解釋。發(fā)生語法錯誤時,就不能繼續(xù)執(zhí)行代碼。在JavaScript中,只有在同一個線程中的代碼會受語法錯誤的影響。在其他線程中的代碼和其他外部引用的文件中的代碼,如果不依賴于包含錯誤的代碼,則可以繼續(xù)執(zhí)行。
  2、運(yùn)行時錯誤:也稱為異常(exception,在編譯期/解釋器后)。此時,問題并不出在代碼的語法上,而是,嘗試完成的一個操作,在某些情況下是非法的。異常只影響發(fā)生的線程,其他JavaScript線程即可繼續(xù)正常的執(zhí)行。

二、錯誤處理


  JavaScript提供了兩種處理錯誤的方式:BOM中的onerror事件處理函數(shù)方式和ECMAScript中的try...catch方式。
  1、onerror事件處理函數(shù)
  它是第一個用來協(xié)助JavaScript處理錯誤的機(jī)制。頁面上出現(xiàn)異常時,error事件便在window對象上觸發(fā)。例如:

復(fù)制代碼 代碼如下:

<html>
<head>
<title>onerror Example</title>
<script type="text/javascript">
window.onerror = function() {
alert("發(fā)生錯誤!");
}
</script>
</head>
<body onload="nonExistentFunction()">
</body>
</html>


在上述代碼中,在頁面載入時嘗試調(diào)用不存在的函數(shù),此時會引發(fā)一個異常。彈出“發(fā)生錯誤”的錯誤信息。但是,瀏覽器的錯誤信息也顯示出來了,如何在瀏覽器上隱藏它呢,只需onerror方法返回一個true即可。

復(fù)制代碼 代碼如下:

<script type="text/javascript">
window.onerror = function() {
alert(“發(fā)生錯誤!”);
return true;
}
</script>


1.1 取出錯誤信息

  onerror處理函數(shù)提供了三種信息來確定錯誤確切的性質(zhì):
  i) 錯誤信息——對于給定錯誤,瀏覽器會顯示同樣的信息
  ii) URL——在哪個文件中發(fā)生了錯誤
  iii) 行號——給定URL中發(fā)生錯誤的行號。
復(fù)制代碼 代碼如下:

window.onerror = function(sMessage, sUrl, iLine) {
alert("發(fā)生錯誤!\n" + sMessage + "\nURL:" + sUrl + "\nLine Number:" + iLine);
return true;
}


  1.2 圖像載入錯誤

  window對象并非唯一支持onerror事件處理函數(shù)的對象,它對圖像對象也提供支持。當(dāng)一個圖像由于文件不存在等原因未能成功載入時,error事件便在這個圖像上觸發(fā)。例如:
復(fù)制代碼 代碼如下:

<img src="noexist.gif" onerror="alert('載入圖片時發(fā)生錯誤')"/>  

上例直接在HTML中分配onerror事件處理函數(shù)。因為noexist.gif不存在,所以會彈出警告框提示用戶。當(dāng)然也可以通過腳本來分配事件處理函數(shù),在設(shè)置圖像的src特性前,必須等待頁面完全載入,例如:
復(fù)制代碼 代碼如下:

<html>
<head>
<title>Image錯誤測試</title>
<script type="text/javascript">
function handleLoad() {
document.images[0].onerror = function() {
alert("載入圖片時發(fā)生錯誤!");
};
document.images[0].src = "amigo.jpg";
}
</script>
</head>
<body onload="handleLoad()">
<img/>
<body>
</html>

注意:與window對象的onerror事件處理函數(shù)不同,image的onerror事件沒有任何關(guān)于額外信息的參數(shù)。

  1.3處理語法錯誤

  onerror事件處理函數(shù)不僅可以處理異常,它還能處理語法錯誤,也只有它才能處理。
  首先,事件處理函數(shù)必須是頁面中第一個出現(xiàn)的代碼,因為如果語法錯誤出現(xiàn)在設(shè)置事件處理函數(shù)之前出現(xiàn),事件處理函數(shù)就沒有用了。記住,語法錯誤會完全停止代碼的執(zhí)行。例如:
復(fù)制代碼 代碼如下:

<html>
<head>
<title>onError Example</title>
<script type="text/javascript">
alert("Syntax error.";
window.onerror = function (sMessage, sUrl, iLine){
alert("An error occurrred:\n" + sMessage + "\nURL:" + sUrl + "\nLine Number:" + iLine );
return true;
}
</script>
</head>
<body onload="nonExistentFunction()">
</body>
</html>

因為突出顯示的那一行代碼(里面有錯誤語法)在分配onerror事件處理函數(shù)之前就出現(xiàn)了,所以瀏覽器直接報告這個錯誤。在錯誤之后的代碼就不再被解釋(因為這個線程已經(jīng)退出了),所以 load 事件解發(fā)時調(diào)用 nonExistentFunction() ,瀏覽器也會報這個錯誤。書中說如果重寫這個頁面,將 onerror 事件處理函數(shù)的分配放在語法錯誤之前,那么會出現(xiàn)兩個警告框:一個顯示語法錯誤,另一個顯示異常。但我測試的結(jié)果還是一樣的報兩個錯誤,并不顯示onerror事件中的信息。

  使用onerror事件處理函數(shù)的主要的問題是,它是BOM的一部分,所以,沒有任何標(biāo)準(zhǔn)能控制它的行為。因此,不同的瀏覽器使用這個事件處理錯誤的方式有明顯的不同,eg,在IE中發(fā)生error事件時,正常的代碼會繼續(xù)執(zhí)行,所有的變量和數(shù)據(jù)都保留下來,并可通過onerror事件處理函數(shù)訪問。在Mozilla中,正常的代碼執(zhí)行都會結(jié)束,同時所有的錯誤發(fā)生之前的變量和數(shù)據(jù)都被銷毀。

  2、try...catch方式

  ECMPScript第三版,引入了try…catch語句?;菊Z法如下:
復(fù)制代碼 代碼如下:

try{
//code
[break;]
} catch ([exception]) {
//code
[break;]
} [finally{
//code
}]

例如:
復(fù)制代碼 代碼如下:

try {
window.openFile1();
alert("成功調(diào)用openFile1方法");
} catch (exception) {
alert("發(fā)生異常!");
} finally {
alert("try..catch測試結(jié)束!");
}

與Java不同,ECMAScript標(biāo)準(zhǔn)在try…catch語句中只能有一個catch語句,因為JavaScript是弱類型的語言,沒辦法指明catch子句中異常的特定類型。不管錯誤是什么類型,都由同一個catch語句處理。Mozilla對其進(jìn)行了擴(kuò)展,可加多個catch語句,但因為只有 Mozilla 可以使用,因此不推薦使用。

  finally用于包含無論是否有異常發(fā)生都要執(zhí)行的代碼,這對關(guān)閉打開的鏈接和釋放資源很有用。

  2.1 嵌套 try...catch 語句

  在 try...catch 語句中的 catch 子句中,也會發(fā)生錯誤。此時,就可以使用嵌套的 try...catch 語句。示例:
復(fù)制代碼 代碼如下:

try {
eval("a ++ b");
} catch(oException) {
alert("發(fā)生錯誤!");
try {
var aError = new Array(1000000000000000000000000000000000000000);
} catch(exception) {
alert("在catch子句中發(fā)生錯誤!");
}
} finally{
alert("已完成")
}


2.2 Error對象

  發(fā)生錯誤時,JavaScript有個Error基類用于拋出。它有兩個特性:
  i)name——表示錯誤類型的字符串
  ii)message——實際的錯誤信息
  Error對象的name對應(yīng)于它的類,可以是如下值之一:
  EvalError:錯誤發(fā)生在eval()函數(shù)中;
  RangeError:數(shù)字值超出JavaScript可表示的范圍;
  ReferenceError:使用了非法的引用;
  SyntaxError:在eval()函數(shù)調(diào)用中發(fā)生了語法錯誤,其他的愈發(fā)錯誤由瀏覽器報告,無法通過try…catch處理;
  TypeError:變量的類型不是預(yù)期所需的;
  URIError:在encodeURI或decodeURI函數(shù)發(fā)生了錯誤。

  2.3 判斷錯誤類型

  盡管每個 try...catch 語句中只能有一個catch子句,但判斷拋出的錯誤類型方法主要有兩種。第一種使用 Error 對象的 name 特性:
復(fù)制代碼 代碼如下:

try {
eval("a ++ b");
} catch(oException) {
if (oException.name = "SyntaxError") {
alert("發(fā)生SyntaxError!");
} else {
alert("發(fā)生其他錯誤!");
}
}

第二種使用 instanceof 操作符,并使用不同錯誤的類名:
復(fù)制代碼 代碼如下:

try {
eval("a ++ b");
} catch(oException) {
if (oException instanceof SyntaxError) {
alert("發(fā)生SyntaxError!");
} else {
alert("發(fā)生其他錯誤!");
}
}


2.4 拋出異常

  在ECMAScript第三版引入,用于有目的的拋出異常,拋出的錯誤對象可為字符串、數(shù)字、布爾值或?qū)嶋H的對象,也可以拋出Error對象(其構(gòu)造函數(shù)只有一個函數(shù),即錯誤信息)。如:
復(fù)制代碼 代碼如下:

throw new Error("錯誤產(chǎn)生!");  

開發(fā)人員拋出的錯誤和由瀏覽器自身拋出的錯誤都在 try...catch 中捕獲。例如:
復(fù)制代碼 代碼如下:

function addTwoNumber(a, b) {
if (arguments.length < 2) {
throw new Error("需要傳入兩個數(shù)字!");
}
}
try {
result = addTwoNumber(90);
} catch(oException) {
if (oException instanceof SyntaxError) {
alert("SyntaxError:" + oException.message);
} else if (oException instanceof Error){
alert(oException.message);
}
}


三、調(diào)試技巧

  現(xiàn)在的瀏覽器大多都自帶了調(diào)試工具,大多數(shù)情況下已經(jīng)夠用了,另外IE下還可以用IETest,F(xiàn)ireFox下還可以用FireBug。

作者:Artwl
出處:http://artwl.cnblogs.com

相關(guān)文章

  • javascript 實現(xiàn)的完全兼容鼠標(biāo)滾軸縮放圖片的代碼

    javascript 實現(xiàn)的完全兼容鼠標(biāo)滾軸縮放圖片的代碼

    以前看到的都是用IE的zoom,所以非IE就不支持,昨天看到這個js中鼠標(biāo)滾輪事件詳解 ,于是完全兼容(IE6-8,FF,Chrome,Opera,Safari)的鼠標(biāo)滾軸縮放圖片效果今天就誕生了
    2010-02-02
  • Javascript實現(xiàn)的簡單右鍵菜單類

    Javascript實現(xiàn)的簡單右鍵菜單類

    這篇文章主要介紹了Javascript實現(xiàn)的簡單右鍵菜單類,通過JavaScript自定義類實現(xiàn)右鍵菜單功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • js+canvas實現(xiàn)兩張圖片合并成一張圖片的方法

    js+canvas實現(xiàn)兩張圖片合并成一張圖片的方法

    這篇文章主要介紹了js+canvas實現(xiàn)兩張圖片合并成一張圖片的方法,結(jié)合實例形式分析了JavaScript結(jié)合HTML5 canvas實現(xiàn)圖片合并的操作技巧,并附帶了Java圖片合并的實現(xiàn)方法,需要的朋友可以參考下
    2019-11-11
  • 封裝了一個js圖片輪換效果的函數(shù)

    封裝了一個js圖片輪換效果的函數(shù)

    圖片輪換的效果隨處可見,但是我還是試著封裝了一個函數(shù)。一個頁面上可以多次調(diào)用。。。由于初學(xué)代碼寫的不是多好,其中有個文件是可以踢出到一個js文件里的,這是為了測試方便,我都給放在了一個頁面里了。
    2011-09-09
  • ionic+html5+API實現(xiàn)雙擊返回鍵退出應(yīng)用

    ionic+html5+API實現(xiàn)雙擊返回鍵退出應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了ionic+html5+API實現(xiàn)雙擊返回鍵退出應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 編寫高性能Javascript代碼的N條建議

    編寫高性能Javascript代碼的N條建議

    JavaScript代碼在web應(yīng)用程序中經(jīng)常用到,但是很多開發(fā)者忽視了一些性能方面的知識,如何編寫高性能javascript代碼呢?接下來,小編跟大家一起學(xué)習(xí)
    2015-10-10
  • 如何用JS獲取帶“\”字符串的中間值?

    如何用JS獲取帶“\”字符串的中間值?

    如何用JS獲取帶“\”字符串的中間值?...
    2007-02-02
  • png在IE6 下無法透明的解決方法匯總

    png在IE6 下無法透明的解決方法匯總

    解決PNG圖片在IE6下的透明這類問題谷歌上很多解決方案,屬于非常常見的問題,以前我做的時候,這類透明我都是用gif,而直接避開png,所以到現(xiàn)在我并沒有去了解過這個問題。今天就把這個問題整理下,解決方案匯總給大家。
    2015-05-05
  • npm qs模塊使用詳解

    npm qs模塊使用詳解

    這篇文章主要介紹了npm qs模塊使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 基于javascript bootstrap實現(xiàn)生日日期聯(lián)動選擇

    基于javascript bootstrap實現(xiàn)生日日期聯(lián)動選擇

    這篇文章主要介紹了基于javascript bootstrap實現(xiàn)生日日期聯(lián)動選擇的相關(guān)資料,需要的朋友可以參考下
    2016-04-04

最新評論