亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

二、錯(cuò)誤處理


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

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

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


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

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

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


1.1 取出錯(cuò)誤信息

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

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


  1.2 圖像載入錯(cuò)誤

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

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

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

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

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

  1.3處理語(yǔ)法錯(cuò)誤

  onerror事件處理函數(shù)不僅可以處理異常,它還能處理語(yǔ)法錯(cuò)誤,也只有它才能處理。
  首先,事件處理函數(shù)必須是頁(yè)面中第一個(gè)出現(xiàn)的代碼,因?yàn)槿绻Z(yǔ)法錯(cuò)誤出現(xiàn)在設(shè)置事件處理函數(shù)之前出現(xiàn),事件處理函數(shù)就沒有用了。記住,語(yǔ)法錯(cuò)誤會(huì)完全停止代碼的執(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>

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

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

  2、try...catch方式

  ECMPScript第三版,引入了try…catch語(yǔ)句?;菊Z(yǔ)法如下:
復(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測(cè)試結(jié)束!");
}

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

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

  2.1 嵌套 try...catch 語(yǔ)句

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

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


2.2 Error對(duì)象

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

  2.3 判斷錯(cuò)誤類型

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

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

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

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


2.4 拋出異常

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

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

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

function addTwoNumber(a, b) {
if (arguments.length < 2) {
throw new Error("需要傳入兩個(gè)數(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 實(shí)現(xiàn)的完全兼容鼠標(biāo)滾軸縮放圖片的代碼

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

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

    Javascript實(shí)現(xiàn)的簡(jiǎn)單右鍵菜單類

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

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

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

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

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

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

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

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

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

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

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

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

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

    npm qs模塊使用詳解

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

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

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

最新評(píng)論