簡介JavaScript錯誤處理機制
1、 try-catch語句
ECMA-262第3版引入了try-catch語句,作為JavaScript中處理異常的一種標準方式。
語法:
try{ // 可能會導(dǎo)致錯誤的代碼 }catch (error){ // 在錯誤發(fā)生時怎么處理 }
也就是說,我們應(yīng)該把所有可能會拋出錯誤的代碼都放在try語句塊中,而把那些用于錯誤處理代碼放在catch塊中。
try-catch語句的邏輯是:如果try塊中的任何代碼發(fā)生了錯誤,就會立即退出代碼執(zhí)行過程,然后接著執(zhí)行catch塊。此時,catch塊會接收到一個包含錯誤信息的對象。
注意:即使你不想使用這個錯誤對象,也要給它起個名字。
雖然這個對象在不同瀏覽器中可能包含不同信息,但是都有一個保存著錯誤消息的message屬性,還有一個保存錯誤類型的name屬性(并不是所有瀏覽器都有)
try{ }catch (error){ console.log(error.message); }
在跨瀏覽器編程時,最好還是只使用message屬性。
1.1 finally子句
當使用finally子句時,其代碼無論如何都會執(zhí)行,也就是說,不管是正常執(zhí)行還是出錯了,finally子句都會執(zhí)行。甚至return語句,也不會阻止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
從運行結(jié)果,我們可以看到,return語句并沒有阻止finally子句的執(zhí)行,而且是在finally子句執(zhí)行后才會返回return語句的值。
2、錯誤類型
執(zhí)行代碼期間可能會發(fā)生的錯誤有多種類型。每種錯誤都有對應(yīng)的錯誤類型,而當錯誤發(fā)生時,會拋出相應(yīng)類型的錯誤對象。
ECMA-262定義了下列7中錯誤類型:
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
Error是基類型,其他錯誤類型都繼承自該類型。所有錯誤類型共享了一組相同的屬性。
(1)EvalError類型
EvalError類型的錯誤會在使用eval()函數(shù)而發(fā)生異常時拋出。簡單的說,如果沒有把eval()當成函數(shù)調(diào)用,就會拋出異常。比如:
new eval() // 拋出EvalError eval = foo; // 拋出EvalError
注意:在ES5中已經(jīng)不在出現(xiàn)了。
(2)RangeError類型
RangeError類型的錯誤會在數(shù)值超出相應(yīng)范圍時觸發(fā)。主要有幾種情況,一是數(shù)組長度為負數(shù),二是Number對象的方法參數(shù)超出范圍,以及函數(shù)堆棧超過最大值。
var item = new Array(-20); // 拋出RangeError異常
(3)ReferenceError類型
在找不到對象的情況下,會發(fā)生ReferenceError。通常,在訪問不存在的變量時,就會發(fā)生這種錯誤。
var obj = x; // 在x并未聲明的情況下拋出ReferenceError
(4)SyntaxError類型
SyntaxError是解析代碼時發(fā)生的語法錯誤。
var 1a; // 變量名錯誤,拋出SyntaxError
(5)TypeError類型
在變量中保存著意外的類型,或在訪問不存在的方法時,都會導(dǎo)致這種錯誤。
var o = new 10; //拋出TypeError
(6)URIError類型
URIError是URI相關(guān)函數(shù)的參數(shù)不正確時拋出的錯誤,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()這六個函數(shù)。
2.2 拋出錯誤
與try-catch語句相配的還有一個throw操作符,用于隨時拋出自定義錯誤。拋出錯誤時,必須要給throw操作符指定一個值,這個值可以是任何類型。
throw 1; throw 'tg'; throw true; throw {name: 'tg'};
2.3 Error對象
所有拋出的錯誤都是Error構(gòu)造函數(shù)的實例。Error構(gòu)造函數(shù)接受一個參數(shù),表示錯誤提示,可以從實例的message屬性讀到這個參數(shù)。
在JavaScript中,Error對象的實例必須有message屬性,表示出錯時的提示信息。在大多數(shù)JavaScript引擎中,Error實例還可能有name和stack屬性,分別表示錯誤的名稱和錯誤的堆棧。
var err = new Error('出錯了'); err.message; // "出錯了"
2.4 自定義錯誤
我們還可以創(chuàng)建自定義錯誤消息,最常用的錯誤類型是Error、RangeError、ReferenceError和TypeError。
throw new Error('報錯了'); throw new RangeError('數(shù)組長度錯誤');
另外,利用原型鏈還可以通過繼承Error來創(chuàng)建自定義錯誤類型:
function CustomError(message){ this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error(); throw new CustomError('我的錯誤信息');
3、錯誤(error)事件
任何沒有通過try-catch處理的錯誤都會觸發(fā)window對象的error事件。
onerror事件處理程序不會創(chuàng)建event對象,但它接受三個參數(shù):錯誤消息、錯誤所在的URL和行號。
window.onerror = function(message, url, line){ };
當你在事件處理程序中返回false,可以阻止瀏覽器報告錯誤的默認行為
window.onerror = function(message, url, line){ return false; };
4、調(diào)試技術(shù)
4.1 alert方法
在以前,大多數(shù)都是在要調(diào)試的代碼中插入alert()函數(shù),看是否執(zhí)行到這一步來判斷哪里出錯,這種方式比較麻煩,因為alert()會阻止后續(xù)代碼的執(zhí)行(除非你關(guān)閉了alert彈窗),而且調(diào)試后還要清理。
4.2 console
隨著瀏覽器的不斷改善,現(xiàn)在的瀏覽器都有JavaScript控制臺,我們可以向這些控制臺輸出消息,比如最常用的console對象,它的常用方法如下:
- error(message):將錯誤消息記錄到控制臺
- info(message):將信息性消息記錄到控制臺
- log(message):將一般消息記錄到控制臺
- warn(message):將警告消息記錄到控制臺
function test(){ console.log('結(jié)果:' + (1 + 2)); }
4.3 throw
使用throw拋出錯誤。
以上就是簡介JavaScript錯誤處理機制的詳細內(nèi)容,更多關(guān)于JavaScript錯誤處理機制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript立即執(zhí)行函數(shù)與函數(shù)劫持的作用
IIFE全拼Imdiately Invoked Function Expression,是一個在定義的時候就立即執(zhí)行的JavaScript函數(shù),這篇文章主要給大家介紹了關(guān)于Javascript立即執(zhí)行函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2023-01-01window.location.href和window.open窗口跳轉(zhuǎn)區(qū)別解析
這篇文章主要為大家介紹了window.location.href和window.open 跳轉(zhuǎn)區(qū)別解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07JavaScript和jQuery獲取input框的絕對位置實現(xiàn)方法
下面小編就為大家?guī)硪黄狫avaScript和jQuery獲取input框的絕對位置實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10微信小程序?qū)崿F(xiàn)判斷是分享到群還是個人功能示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)判斷是分享到群還是個人功能,結(jié)合實例形式分析了微信小程序分享與判斷功能的實現(xiàn)原理、步驟及相關(guān)操作技巧,需要的朋友可以參考下2019-05-05