Javascript 錯(cuò)誤處理的幾種方法
更新時(shí)間:2009年06月13日 23:57:12 作者:
瀏覽器不會(huì)拋出Error類型的exception異常,所以如果捕獲到Error類型的異常,可以確定這個(gè)異常是用戶代碼拋出的,不是瀏覽器拋出的。
1.使用window.onerror指定錯(cuò)誤處理函數(shù)。
當(dāng)有錯(cuò)誤的時(shí)候,onerror會(huì)被callback。 當(dāng)某個(gè)JavaScript block中有多個(gè)script錯(cuò)誤時(shí),第一個(gè)錯(cuò)誤觸發(fā)后(回調(diào)callback),當(dāng)前Javascript block后面的script會(huì)被自動(dòng)Drop忽略掉,不被執(zhí)行。
如:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
<script type="text/javascript">
window.onerror = function(message, url, line)
{
alert("Error.\nMessage:"+ message +"\nUrl:" + url + "\nLine:" + line)
return true;
}
</script>
</head>
<body>
<script type="text/javascript">
test();
test();
test();
test();
</script>
<script type="text/javascript">
test();
test();
test();
test();
</script>
</body>
</html>
在上面的例子中只會(huì)有每一個(gè)block中的第一個(gè)test();產(chǎn)生error。觸發(fā)window.onerror回調(diào),后面的Javascript會(huì)被忽略掉。img 也支持 onerror < img src="pic.gif" onerror = "javascript:alert("An error occurred.");"/>。onerror 是瀏覽器支持的對(duì)象。由瀏覽器決定是否可以使用,不是DOM標(biāo)準(zhǔn)。
2.使用Javascript中的try catch throw處理異常。
Javascript支持了try catch throw,Javascript中定義的異常:
(1)EvalError: An error occurs in the eval() function.
(2)RangeError: A number value is greater then or less then the number that can be represented in Javascript(Number.MAX_VALUE and Number.MIN_VAKUE).
(3)ReferenceError: An illegal reference is used.
(4)SyntaxError: A syntax error occus inside of an eval() function call. All other syntax error are reorted by the browser and cannot be handled with a try...catch statement.
(5)TypeError. A variables type is unexpected. 6.URIError. An error ocuurs in the encodeURI() or the decodeURI() function.
如:
<script type="text/javascript">
function CreateError()
{
throw new Error("Created error by custom.");
}
try
{
//throw a error from a function just want to see the call stack in firefox.
CreateError();
}
catch(error)
{
var errorMsg = ("Message: " + error.message + "\n");
if(typeof(error.stack)!=undefined)
{
//FF
errorMsg += ("Line Number: " + error.lineNumber + "\n");
errorMsg += ("File Name: " + error.fileName + "\n");
errorMsg += ("Stack Trace:\n" + error.stack + "\n");
}
else
{
//IE
errorMsg += ("Description: " + error.description + "\n");
errorMsg += ("Number: " + error.number + "\n");
}
alert(errorMsg);
}
finally
{
//alert("End try catch.message from finally block.");
}
</script>
Error.message是IE和FireFox都支持的屬性。
IE支持description 和 number屬性。
FF支持fileName lineNumber 和 stack 屬性。
由于Javascript是弱類型的語(yǔ)言。
所以在catch部分只能catch一次,不能像C#這樣的語(yǔ)言可以寫(xiě)多個(gè)catch,catch不同類型的exception。
但是可以用 instanceof ErrorType的方式實(shí)現(xiàn)類似的功能。
如:
<script type="text/javascript">
try
{ //Syntax Error
//eval("alert a");
//Custom Error
throw new Error("An error occured.");
}
catch(error)
{
if(error instanceof SyntaxError)
{
alert("Syntax Error");
}
else if(error instanceof EvalError)
{
alert("Eval Error");
}
else if(error instanceof RangeError)
{
alert("Range Error");
}
else if(error instanceof ReferenceError)
{
alert("Reference Error");
}
else if(error instanceof TypeError)
{
alert("Type Error");
}
else if(error instanceof Error)
{
alert("Custon Error");
}
alert(error.message);
}
</script>
注:瀏覽器不會(huì)拋出Error類型的exception異常,所以如果捕獲到Error類型的異常,可以確定這個(gè)異常是用戶代碼拋出的,不是瀏覽器拋出的。
Javascript的assert()
function assert(bCondition, sErrorMsg) {
if (!bCondition) {
alert(sErrorMsg);
throw new Error(sErrorMsg);
}
}
當(dāng)有錯(cuò)誤的時(shí)候,onerror會(huì)被callback。 當(dāng)某個(gè)JavaScript block中有多個(gè)script錯(cuò)誤時(shí),第一個(gè)錯(cuò)誤觸發(fā)后(回調(diào)callback),當(dāng)前Javascript block后面的script會(huì)被自動(dòng)Drop忽略掉,不被執(zhí)行。
如:
復(fù)制代碼 代碼如下:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
<script type="text/javascript">
window.onerror = function(message, url, line)
{
alert("Error.\nMessage:"+ message +"\nUrl:" + url + "\nLine:" + line)
return true;
}
</script>
</head>
<body>
<script type="text/javascript">
test();
test();
test();
test();
</script>
<script type="text/javascript">
test();
test();
test();
test();
</script>
</body>
</html>
在上面的例子中只會(huì)有每一個(gè)block中的第一個(gè)test();產(chǎn)生error。觸發(fā)window.onerror回調(diào),后面的Javascript會(huì)被忽略掉。img 也支持 onerror < img src="pic.gif" onerror = "javascript:alert("An error occurred.");"/>。onerror 是瀏覽器支持的對(duì)象。由瀏覽器決定是否可以使用,不是DOM標(biāo)準(zhǔn)。
2.使用Javascript中的try catch throw處理異常。
Javascript支持了try catch throw,Javascript中定義的異常:
(1)EvalError: An error occurs in the eval() function.
(2)RangeError: A number value is greater then or less then the number that can be represented in Javascript(Number.MAX_VALUE and Number.MIN_VAKUE).
(3)ReferenceError: An illegal reference is used.
(4)SyntaxError: A syntax error occus inside of an eval() function call. All other syntax error are reorted by the browser and cannot be handled with a try...catch statement.
(5)TypeError. A variables type is unexpected. 6.URIError. An error ocuurs in the encodeURI() or the decodeURI() function.
如:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function CreateError()
{
throw new Error("Created error by custom.");
}
try
{
//throw a error from a function just want to see the call stack in firefox.
CreateError();
}
catch(error)
{
var errorMsg = ("Message: " + error.message + "\n");
if(typeof(error.stack)!=undefined)
{
//FF
errorMsg += ("Line Number: " + error.lineNumber + "\n");
errorMsg += ("File Name: " + error.fileName + "\n");
errorMsg += ("Stack Trace:\n" + error.stack + "\n");
}
else
{
//IE
errorMsg += ("Description: " + error.description + "\n");
errorMsg += ("Number: " + error.number + "\n");
}
alert(errorMsg);
}
finally
{
//alert("End try catch.message from finally block.");
}
</script>
Error.message是IE和FireFox都支持的屬性。
IE支持description 和 number屬性。
FF支持fileName lineNumber 和 stack 屬性。
由于Javascript是弱類型的語(yǔ)言。
所以在catch部分只能catch一次,不能像C#這樣的語(yǔ)言可以寫(xiě)多個(gè)catch,catch不同類型的exception。
但是可以用 instanceof ErrorType的方式實(shí)現(xiàn)類似的功能。
如:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
try
{ //Syntax Error
//eval("alert a");
//Custom Error
throw new Error("An error occured.");
}
catch(error)
{
if(error instanceof SyntaxError)
{
alert("Syntax Error");
}
else if(error instanceof EvalError)
{
alert("Eval Error");
}
else if(error instanceof RangeError)
{
alert("Range Error");
}
else if(error instanceof ReferenceError)
{
alert("Reference Error");
}
else if(error instanceof TypeError)
{
alert("Type Error");
}
else if(error instanceof Error)
{
alert("Custon Error");
}
alert(error.message);
}
</script>
注:瀏覽器不會(huì)拋出Error類型的exception異常,所以如果捕獲到Error類型的異常,可以確定這個(gè)異常是用戶代碼拋出的,不是瀏覽器拋出的。
Javascript的assert()
復(fù)制代碼 代碼如下:
function assert(bCondition, sErrorMsg) {
if (!bCondition) {
alert(sErrorMsg);
throw new Error(sErrorMsg);
}
}
相關(guān)文章
“增強(qiáng)js程序代碼的健壯性”之我見(jiàn)大量示例代碼
“增強(qiáng)js程序代碼的健壯性”之我見(jiàn)大量示例代碼...2007-05-05簡(jiǎn)單的無(wú)縫滾動(dòng)程序-僅幾行代碼
簡(jiǎn)單的無(wú)縫滾動(dòng)程序-僅幾行代碼...2007-05-05淺析$(function) ready和onload 的區(qū)別
新手剛學(xué)習(xí)js和jq的時(shí)候難免會(huì)接觸題目所標(biāo)識(shí)的相關(guān)內(nèi)容,下面小編通過(guò)本教程給大家講解(function) ready和onload 的區(qū)別,感興趣的朋友一起看看吧2016-09-09關(guān)于JavaScript遞歸經(jīng)典案例題詳析
遞歸是算法中一個(gè)重要的解法,因此,有必要單拎出來(lái)講講,所以下面這篇文章主要給大家介紹了關(guān)于JavaScript遞歸經(jīng)典案例題的相關(guān)資料,需要的朋友可以參考下2021-07-07js實(shí)現(xiàn)下一頁(yè)頁(yè)碼效果
本文主要介紹了js實(shí)現(xiàn)下一頁(yè)頁(yè)碼效果的實(shí)例,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03javascript replace方法與正則表達(dá)式
replace方法的語(yǔ)法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正則表達(dá)式對(duì)象(RegExp)也可以是字符串(string),replaceText是替代查找到的字符串。。為了幫助大家更好的理解,下面舉個(gè)簡(jiǎn)單例子說(shuō)明一下2008-02-02JavaScript 動(dòng)態(tài)將數(shù)字金額轉(zhuǎn)化為中文大寫(xiě)金額
JavaScript 將數(shù)字金額轉(zhuǎn)化為中文大寫(xiě)金額的函數(shù)2009-05-05javascript 單例模式詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了javascript 單例模式詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02