簡(jiǎn)介JavaScript錯(cuò)誤處理機(jī)制
1、 try-catch語(yǔ)句
ECMA-262第3版引入了try-catch語(yǔ)句,作為JavaScript中處理異常的一種標(biāo)準(zhǔn)方式。
語(yǔ)法:
try{
// 可能會(huì)導(dǎo)致錯(cuò)誤的代碼
}catch (error){
// 在錯(cuò)誤發(fā)生時(shí)怎么處理
}
也就是說(shuō),我們應(yīng)該把所有可能會(huì)拋出錯(cuò)誤的代碼都放在try語(yǔ)句塊中,而把那些用于錯(cuò)誤處理代碼放在catch塊中。
try-catch語(yǔ)句的邏輯是:如果try塊中的任何代碼發(fā)生了錯(cuò)誤,就會(huì)立即退出代碼執(zhí)行過(guò)程,然后接著執(zhí)行catch塊。此時(shí),catch塊會(huì)接收到一個(gè)包含錯(cuò)誤信息的對(duì)象。
注意:即使你不想使用這個(gè)錯(cuò)誤對(duì)象,也要給它起個(gè)名字。
雖然這個(gè)對(duì)象在不同瀏覽器中可能包含不同信息,但是都有一個(gè)保存著錯(cuò)誤消息的message屬性,還有一個(gè)保存錯(cuò)誤類型的name屬性(并不是所有瀏覽器都有)
try{
}catch (error){
console.log(error.message);
}
在跨瀏覽器編程時(shí),最好還是只使用message屬性。
1.1 finally子句
當(dāng)使用finally子句時(shí),其代碼無(wú)論如何都會(huì)執(zhí)行,也就是說(shuō),不管是正常執(zhí)行還是出錯(cuò)了,finally子句都會(huì)執(zhí)行。甚至return語(yǔ)句,也不會(huì)阻止finally子句的執(zhí)行。
看下面的例子:
function test(){
try{
console.log('a');
return 2;
}catch(error){
console.log('b');
}finally{
console.log('c');
}
}
console.log(test());
//結(jié)果
a
c
2
從運(yùn)行結(jié)果,我們可以看到,return語(yǔ)句并沒(méi)有阻止finally子句的執(zhí)行,而且是在finally子句執(zhí)行后才會(huì)返回return語(yǔ)句的值。
2、錯(cuò)誤類型
執(zhí)行代碼期間可能會(huì)發(fā)生的錯(cuò)誤有多種類型。每種錯(cuò)誤都有對(duì)應(yīng)的錯(cuò)誤類型,而當(dāng)錯(cuò)誤發(fā)生時(shí),會(huì)拋出相應(yīng)類型的錯(cuò)誤對(duì)象。
ECMA-262定義了下列7中錯(cuò)誤類型:
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
Error是基類型,其他錯(cuò)誤類型都繼承自該類型。所有錯(cuò)誤類型共享了一組相同的屬性。
(1)EvalError類型
EvalError類型的錯(cuò)誤會(huì)在使用eval()函數(shù)而發(fā)生異常時(shí)拋出。簡(jiǎn)單的說(shuō),如果沒(méi)有把eval()當(dāng)成函數(shù)調(diào)用,就會(huì)拋出異常。比如:
new eval() // 拋出EvalError eval = foo; // 拋出EvalError
注意:在ES5中已經(jīng)不在出現(xiàn)了。
(2)RangeError類型
RangeError類型的錯(cuò)誤會(huì)在數(shù)值超出相應(yīng)范圍時(shí)觸發(fā)。主要有幾種情況,一是數(shù)組長(zhǎng)度為負(fù)數(shù),二是Number對(duì)象的方法參數(shù)超出范圍,以及函數(shù)堆棧超過(guò)最大值。
var item = new Array(-20); // 拋出RangeError異常
(3)ReferenceError類型
在找不到對(duì)象的情況下,會(huì)發(fā)生ReferenceError。通常,在訪問(wèn)不存在的變量時(shí),就會(huì)發(fā)生這種錯(cuò)誤。
var obj = x; // 在x并未聲明的情況下拋出ReferenceError
(4)SyntaxError類型
SyntaxError是解析代碼時(shí)發(fā)生的語(yǔ)法錯(cuò)誤。
var 1a; // 變量名錯(cuò)誤,拋出SyntaxError
(5)TypeError類型
在變量中保存著意外的類型,或在訪問(wèn)不存在的方法時(shí),都會(huì)導(dǎo)致這種錯(cuò)誤。
var o = new 10; //拋出TypeError
(6)URIError類型
URIError是URI相關(guān)函數(shù)的參數(shù)不正確時(shí)拋出的錯(cuò)誤,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()這六個(gè)函數(shù)。
2.2 拋出錯(cuò)誤
與try-catch語(yǔ)句相配的還有一個(gè)throw操作符,用于隨時(shí)拋出自定義錯(cuò)誤。拋出錯(cuò)誤時(shí),必須要給throw操作符指定一個(gè)值,這個(gè)值可以是任何類型。
throw 1;
throw 'tg';
throw true;
throw {name: 'tg'};
2.3 Error對(duì)象
所有拋出的錯(cuò)誤都是Error構(gòu)造函數(shù)的實(shí)例。Error構(gòu)造函數(shù)接受一個(gè)參數(shù),表示錯(cuò)誤提示,可以從實(shí)例的message屬性讀到這個(gè)參數(shù)。
在JavaScript中,Error對(duì)象的實(shí)例必須有message屬性,表示出錯(cuò)時(shí)的提示信息。在大多數(shù)JavaScript引擎中,Error實(shí)例還可能有name和stack屬性,分別表示錯(cuò)誤的名稱和錯(cuò)誤的堆棧。
var err = new Error('出錯(cuò)了');
err.message; // "出錯(cuò)了"
2.4 自定義錯(cuò)誤
我們還可以創(chuàng)建自定義錯(cuò)誤消息,最常用的錯(cuò)誤類型是Error、RangeError、ReferenceError和TypeError。
throw new Error('報(bào)錯(cuò)了');
throw new RangeError('數(shù)組長(zhǎng)度錯(cuò)誤');
另外,利用原型鏈還可以通過(guò)繼承Error來(lái)創(chuàng)建自定義錯(cuò)誤類型:
function CustomError(message){
this.name = 'CustomError';
this.message = message;
}
CustomError.prototype = new Error();
throw new CustomError('我的錯(cuò)誤信息');
3、錯(cuò)誤(error)事件
任何沒(méi)有通過(guò)try-catch處理的錯(cuò)誤都會(huì)觸發(fā)window對(duì)象的error事件。
onerror事件處理程序不會(huì)創(chuàng)建event對(duì)象,但它接受三個(gè)參數(shù):錯(cuò)誤消息、錯(cuò)誤所在的URL和行號(hào)。
window.onerror = function(message, url, line){
};
當(dāng)你在事件處理程序中返回false,可以阻止瀏覽器報(bào)告錯(cuò)誤的默認(rèn)行為
window.onerror = function(message, url, line){
return false;
};
4、調(diào)試技術(shù)
4.1 alert方法
在以前,大多數(shù)都是在要調(diào)試的代碼中插入alert()函數(shù),看是否執(zhí)行到這一步來(lái)判斷哪里出錯(cuò),這種方式比較麻煩,因?yàn)閍lert()會(huì)阻止后續(xù)代碼的執(zhí)行(除非你關(guān)閉了alert彈窗),而且調(diào)試后還要清理。
4.2 console
隨著瀏覽器的不斷改善,現(xiàn)在的瀏覽器都有JavaScript控制臺(tái),我們可以向這些控制臺(tái)輸出消息,比如最常用的console對(duì)象,它的常用方法如下:
- error(message):將錯(cuò)誤消息記錄到控制臺(tái)
- info(message):將信息性消息記錄到控制臺(tái)
- log(message):將一般消息記錄到控制臺(tái)
- warn(message):將警告消息記錄到控制臺(tái)
function test(){
console.log('結(jié)果:' + (1 + 2));
}
4.3 throw
使用throw拋出錯(cuò)誤。
以上就是簡(jiǎn)介JavaScript錯(cuò)誤處理機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于JavaScript錯(cuò)誤處理機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于JavaScript中高階函數(shù)的魅力詳解
高階函數(shù):英文叫Higher-order function。JavaScript的函數(shù)其實(shí)都指向某個(gè)變量。下面這篇文章主要給大家介紹了關(guān)于JavaScript中高階函數(shù)的魅力,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09
基于JavaScript實(shí)現(xiàn)回到頁(yè)面頂部動(dòng)畫(huà)代碼
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)回到頁(yè)面頂部動(dòng)畫(huà)代碼的相關(guān)資料,代碼簡(jiǎn)單易用,非常實(shí)用,需要的朋友可以參考下2016-05-05
webpack之引入圖片的實(shí)現(xiàn)及問(wèn)題
如果我們希望在頁(yè)面引入圖片。當(dāng)我們基于webpack進(jìn)行開(kāi)發(fā)時(shí),引入圖片會(huì)遇到一些問(wèn)題,這篇文章主要介紹了webpack之引入圖片的實(shí)現(xiàn)及問(wèn)題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
element select下拉框編輯時(shí)回顯已經(jīng)刪除的數(shù)據(jù)操作代碼
今天做項(xiàng)目遇到一個(gè)棘手的問(wèn)題,關(guān)于element select下拉框編輯時(shí)回顯問(wèn)題,下面小編通過(guò)實(shí)例代碼介紹element select下拉框編輯時(shí)回顯已經(jīng)刪除的數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧2024-05-05
通過(guò)V8源碼看一個(gè)關(guān)于JS數(shù)組排序的詭異問(wèn)題
一直在學(xué)習(xí)C++,也想閱讀點(diǎn)開(kāi)源的C++項(xiàng)目,發(fā)現(xiàn)網(wǎng)上對(duì)Google V8評(píng)價(jià)不錯(cuò),于是上Github上找到了源代碼,但在學(xué)習(xí)中遇到一個(gè)js數(shù)組排序的問(wèn)題,下面這篇文章主要給大家介紹了通過(guò)V8源碼說(shuō)說(shuō)一個(gè)關(guān)于JS數(shù)組排序的詭異問(wèn)題的相關(guān)資料,需要的朋友可以參考下。2017-08-08
JavaScript實(shí)現(xiàn)微信紅包算法及問(wèn)題解決方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)微信紅包算法及遇到的問(wèn)題解決方法,需要的朋友可以參考下2018-04-04
js操作時(shí)間(年-月-日 時(shí)-分-秒 星期幾)
js操作時(shí)間(年-月-日 時(shí)-分-秒 星期幾),需要的朋友可以參考下。2010-06-06
JavaScript中定時(shí)器setTimeout()和setInterval()的用法
本文詳細(xì)講解了JavaScript中定時(shí)器setTimeout()和setInterval()的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
解決webpack無(wú)法通過(guò)IP地址訪問(wèn)localhost的問(wèn)題
下面小編就為大家分享一篇解決webpack無(wú)法通過(guò)IP地址訪問(wèn)localhost的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
PHP配置文件php.ini中打開(kāi)錯(cuò)誤報(bào)告的設(shè)置方法
這篇文章主要介紹了PHP配置文件php.ini中打開(kāi)錯(cuò)誤報(bào)告的設(shè)置方法,需要的朋友可以參考下2015-01-01

