1.onerror事件處理函數(shù)
onerror事件處理函數(shù)是第一個(gè)用來(lái)協(xié)助javascript處理錯(cuò)誤的機(jī)制。頁(yè)面上出現(xiàn)異常時(shí),error事件便在window對(duì)象上觸發(fā)。
例如:
<html>
<head>
<title>OnError Example</title>
<script type="text/javascript">
window.onerror = function () {
alert("An error occurred.");
}
</script>
</head>
<body onload="nonExistentFunction()">
</body>
</html>
在這個(gè)例子中,嘗試調(diào)用不存在的函數(shù)nonExistentFunction()時(shí),就會(huì)引發(fā)一個(gè)異常。這時(shí)會(huì)彈出警告框顯示“An error occurred.”不幸的是,瀏覽器的錯(cuò)誤信息也顯示出來(lái)了,要從瀏覽器中隱藏它,onerror事件處理函數(shù)必須返回true值:如下
<html>
<head>
<title>OnError Example</title>
<script type="text/javascript">
window.onerror = function () {
alert("An error occurred.");
return true;
}
</script>
</head>
<body onload="nonExistentFunction()">
</body>
</html>
2.取出錯(cuò)誤信息
onerror事件處理函數(shù)提供了三種信息來(lái)確定錯(cuò)誤確切的性質(zhì):
錯(cuò)誤信息--對(duì)于給定錯(cuò)誤,瀏覽器會(huì)顯示同樣的信息。
URL--在哪個(gè)文件中發(fā)生了錯(cuò)誤。
行號(hào)--給定的URL中發(fā)生錯(cuò)誤的行號(hào)。
<html>
<head>
<title>OnError Example</title>
<script type="text/javascript">
window.onerror = function (sMessage, sUrl, sLine) {
alert("An error occurred:\n" + sMessage + "\nURL: " + sUrl + "\nLine Number: " + sLine);
return true;
}
</script>
</head>
<body onload="nonExistentFunction()">
</body>
</html>
3.圖像載入錯(cuò)誤
圖像對(duì)象也支持onerror事件處理函數(shù)。當(dāng)一個(gè)圖像由于某種原因未能成功載入時(shí)(例如,文件不存在),error事件便在這個(gè)圖像上觸發(fā)。
<html>
<head>
<title>Image Error Test</title>
</head>
<body>
<p>The image below attempts to load a file that doesn't exist.</p>
<img src="blue.gif" onerror="alert('An error occurred loading the image.')" />
</body>
</html>
與window對(duì)象的onerror事件處理函數(shù)不同,image的onerror事件處理函數(shù)沒(méi)有任務(wù)關(guān)于額外信息的參數(shù)。
4.處理語(yǔ)法錯(cuò)誤
onerror事件處理函數(shù)不僅可以處理異常,它還能處理語(yǔ)法錯(cuò)誤,也只有它才能處理。
<html>
<head>
<title>OnError Example</title>
<script type="text/javascript">
window.onerror = function (sMessage, sUrl, sLine) {
alert("An error occurred:\n" + sMessage + "\nURL: " + sUrl + "\nLine Number: " + sLine);
return true;
}
alert("Syntax error.";
</script>
</head>
<body onload="nonExistentFunction()">
<p>The syntax error on this page comes <em>after</em> the <code>onerror</code>
event handler is defined, so the custom dialog catches it.</p>
<p><strong>Note:</strong> This may not work in newer browsers with tighter security restrictions.</p>
</body>
</html>
注:使用onerror事件處理函數(shù)的主要問(wèn)題是,它是BOM的一部分,所以,沒(méi)有任何標(biāo)準(zhǔn)能控制它的行為。因此,不同的瀏覽器使用這個(gè)事件處理函數(shù)處理錯(cuò)誤的方式有明顯的不同。例如,在IE中發(fā)生error事件時(shí),正常的代碼會(huì)繼續(xù)執(zhí)行:所有的變量和數(shù)據(jù)都保存下來(lái),并可能過(guò)onerror事件處理函數(shù)訪問(wèn)。然而在Mozilla中,正常的代碼執(zhí)行都會(huì)結(jié)束,同時(shí)所有錯(cuò)誤發(fā)生之前的變量和數(shù)據(jù)都被銷(xiāo)毀。Safari和Konqueror不支持window對(duì)象上的onerror事件處理函數(shù),但是它們支持圖像上的onerror事件處理函數(shù)。
5.try...catch語(yǔ)句
<html>
<head>
<title>Try Catch Example</title>
<script type="text/javascript">
try {
window.nonExistentFunction();
alert("Method completed.");
} catch (exception) {
alert("An exception occurred.");
} finally {
alert("End of try...catch test.");
}
</script>
</head>
<body>
</body>
</html>
與java不同,ECMAScript標(biāo)準(zhǔn)在try...catch語(yǔ)句中指定只能有一個(gè)catch子句。因?yàn)閖avascript是弱類型,沒(méi)辦法指明catch子句中的異常的特定類型。不管錯(cuò)誤是什么類型,都由同一個(gè)catch子句處理。Mozilla對(duì)其進(jìn)行了擴(kuò)展,可為try...catch語(yǔ)句添加多個(gè)catch子句。當(dāng)然只有Mozilla才能使用這個(gè)形式,所以不推薦使用。
(1)嵌套try...catch語(yǔ)句
<html>
<head>
<title>Try Catch Example</title>
<script type="text/javascript">
try {
eval("a ++ b"); //causes error
} catch (oException) {
alert("An exception occurred.");
try {
var arrErrors = new Array(10000000000000000000000); //causes error
arrErrors.push(exception);
} catch (oException2) {
alert("Another exception occurred.");
}
} finally {
alert("All done.");
}
</script>
</head>
<body>
</body>
</html>
(2)Error對(duì)象
類似于java有個(gè)用于拋出的基類Exception,javascript有個(gè)Error基類用于拋出。Error對(duì)象有以下特性:
name--表示錯(cuò)誤類型的字符串。
message--實(shí)際的錯(cuò)誤信息。
Error對(duì)象的名稱對(duì)象對(duì)應(yīng)于它的類(因?yàn)镋rror只是一個(gè)基類),可以是以下值之一:
類 |
發(fā)生原因 |
EvalError |
錯(cuò)誤發(fā)生在eval()函數(shù)中 |
RangeError |
數(shù)字的值超出javascript可表示的范圍 |
ReferenceError |
使用了非法的引用 |
SyntaxError |
在eval()函數(shù)調(diào)用中發(fā)生了語(yǔ)法錯(cuò)誤。其他的語(yǔ)法錯(cuò)誤由瀏覽器報(bào)告,無(wú)法通過(guò)try...catch語(yǔ)句處理 |
TypeError |
變量的類型不是預(yù)期所需的 |
URIError |
在encodeURI()或者decodeURI()函數(shù)中發(fā)生了錯(cuò)誤 |
Mozilla和IE都擴(kuò)展了Erro對(duì)象以適應(yīng)各自的需求。Mozilla提供一個(gè)fileName特性來(lái)表示錯(cuò)誤發(fā)生在哪一個(gè)文件中,以及一個(gè)stack特性以包含到錯(cuò)誤發(fā)生時(shí)的調(diào)用堆棧;IE提供了一個(gè)number特性來(lái)表示錯(cuò)誤代號(hào)。
(3)判斷錯(cuò)誤類型
<html>
<head>
<title>Try Catch Example</title>
<script type="text/javascript">
try {
eval("a ++ b"); //causes SyntaxError
} catch (oException) {
if (oException.name == "SyntaxError") { //或者if(oException instanceof SyntaxError)
alert("Syntax Error: " + oException.message);
} else {
alert("An unexpected error occurred: " + oException.message);
}
}
</script>
</head>
<body>
</body>
</html>
(4)拋出異常
ECMAScript第三版還引入了throw語(yǔ)句,用于有目的的拋出異常。語(yǔ)法如下:
throw error_object; //error_object可以是字符串、數(shù)字、布爾值或者是實(shí)際的對(duì)象。
<html>
<head>
<title>Try Catch Example</title>
<script type="text/javascript">
function addTwoNumbers(a, b) {
if (arguments.length < 2) {
throw new Error("Two numbers are required.");
} else {
return a + b;
}
}
try {
result = addTwoNumbers(90);
} catch (oException) {
alert(oException.message); //outputs "Two numbers are required."
}
</script>
</head>
<body>
</body>
</html>
另個(gè),因?yàn)闉g覽器不生成Error對(duì)象(它總是生成一個(gè)較精確的Error對(duì)象,比如RangeError),所以區(qū)分瀏覽器拋出的錯(cuò)誤和開(kāi)發(fā)人員拋出的錯(cuò)誤很簡(jiǎn)單,使用前面的技術(shù)就行了:
try{
result = addTwoNumber(90,parseInt(z));
}catch(oException){
if(oException instanceof SyntaxError){
alert("Syntax Error: "+oException.message);
}else if(oException instanceof Error){
alert(oException.message);
}
}
注意檢查instanceof Error必須是if語(yǔ)句中的最后一個(gè)條件,因?yàn)樗衅渌腻e(cuò)誤類都繼承于它(所以在檢測(cè)instanceof Error時(shí)都返回true)。
所有的瀏覽器都可以報(bào)告開(kāi)發(fā)人員拋出的錯(cuò)誤,但是錯(cuò)誤消息的顯示方式可能有所不同。IE6只會(huì)在拋出Error對(duì)象時(shí),才顯示錯(cuò)誤信息;其他情況下,它就只顯示Exception thrown and not caught,而沒(méi)有任何詳細(xì)內(nèi)容。Mozilla則會(huì)報(bào)告Error:uncaught exception:然后調(diào)用所拋出的對(duì)象的toString()方法。
posted on 2007-04-25 00:58
小祝 閱讀(2088)
評(píng)論(1) 編輯 收藏 所屬分類:
Javascript