try catch finally是ECMAScript-262 第三版提供異常處理機(jī)制的標(biāo)準(zhǔn),語(yǔ)法結(jié)構(gòu)如下:
try{ //可能會(huì)發(fā)生的錯(cuò)誤代碼 } catch(error){ //錯(cuò)誤處理 }finally{ //無(wú)論是否有異常都會(huì)執(zhí)行 }
語(yǔ)法與大多數(shù)語(yǔ)言一樣 如java .net,如果try{}代碼塊捕獲到了異常,那么catch塊會(huì)得到一個(gè)錯(cuò)誤信息對(duì)象(Error 的實(shí)例)。
我們應(yīng)該把有可能發(fā)生錯(cuò)誤的代碼放在try塊中,而錯(cuò)誤處理在catch塊中;在js中如果<script></script>代碼塊中發(fā)生了錯(cuò)誤且沒(méi)有進(jìn)行捕獲異常處理,那么當(dāng)前<script>代碼塊后續(xù)的代碼是不會(huì)執(zhí)行的 ,但是不會(huì)影響到其他<script></script>代碼塊代碼如:
<script> function run(){ console.log(age); } run(); console.log('可以
反之后續(xù)的代碼還是會(huì)執(zhí)行 如:
<script> function run(){ try{ console.log(age); }catch(error){ } } run(); console.log('可以
如果存在finally代碼塊,那么不管什么原因里面的代碼都會(huì)執(zhí)行,甚至是catch 語(yǔ)句中有return語(yǔ)句 如下代碼:
function say() { try { console.log(age) return; } catch (erroe) { console.log(erroe.message);//age is not defined return; } finally { console.log('finally 執(zhí)行了');//finally 執(zhí)行了 } } say();
認(rèn)識(shí)Error 類(lèi)型
當(dāng)代碼運(yùn)行時(shí)發(fā)生錯(cuò)誤,會(huì)創(chuàng)建一個(gè)Error對(duì)象,并將其拋出,這個(gè)對(duì)象包含了錯(cuò)誤的描述信息。
如在 try...catch(error){...} 語(yǔ)句中Error 是Error類(lèi)型拋出的對(duì)象,該對(duì)象有三個(gè)基本的屬性name 錯(cuò)誤名稱(chēng),message 錯(cuò)誤信息,stack 錯(cuò)誤棧信息;
執(zhí)行代碼期間可能會(huì)發(fā)生的錯(cuò)誤有多種類(lèi)型,所以Error 又派生了幾個(gè)兒子 如:
Error Error 類(lèi)型的錯(cuò)誤很少見(jiàn),如果有也是瀏覽器拋出的;這個(gè)基類(lèi)型的主要目的是供開(kāi)發(fā)人員拋出自定義錯(cuò)誤。
EvalError 創(chuàng)建一個(gè)error實(shí)例,表示錯(cuò)誤的原因:與 eval() 有關(guān)。
InternalError 創(chuàng)建一個(gè)代表Javascript引擎內(nèi)部錯(cuò)誤的異常拋出的實(shí)例。 如: "遞歸太多".
RangeError 創(chuàng)建一個(gè)error實(shí)例,表示錯(cuò)誤的原因:數(shù)值變量或參數(shù)超出其有效范圍。
ReferenceError 創(chuàng)建一個(gè)error實(shí)例,表示錯(cuò)誤的原因:無(wú)效引用。
SyntaxError 創(chuàng)建一個(gè)error實(shí)例,表示錯(cuò)誤的原因:eval()在解析代碼的過(guò)程中發(fā)生的語(yǔ)法錯(cuò)誤。
TypeError 創(chuàng)建一個(gè)error實(shí)例,表示錯(cuò)誤的原因:變量或參數(shù)不屬于有效類(lèi)型。
URIError 創(chuàng)建一個(gè)error實(shí)例,表示錯(cuò)誤的原因:給 encodeURI()或 decodeURl()傳遞的參數(shù)無(wú)效。
Error 是基類(lèi),其他錯(cuò)誤類(lèi)型都是繼承自Error類(lèi)型,所以子類(lèi)也就具備了三個(gè)基本的屬性name 錯(cuò)誤名稱(chēng),message 錯(cuò)誤信息,stack 錯(cuò)誤棧信息。
有了這些錯(cuò)誤類(lèi)型我們就可以寫(xiě)類(lèi)似這樣的代碼,通過(guò)判斷異常的類(lèi)型來(lái)特定處理某一類(lèi)的異常 如:
<script> function run() { try { say("hello word"); } catch (error) { for (var p in error) { document.writeln(error[p]); } //上面可以遍歷錯(cuò)誤 if (error instanceof EvalError) { //如果非法調(diào)用了eval()函數(shù),則會(huì)拋出EvalError的異常。 alert("EvalError"); } else if (error instanceof ReferenceError) { //錯(cuò)誤的引用,此例子是執(zhí)行到了本步。 alert("ReferenceError"); } else if (error instanceof RangeError) { //數(shù)值超出了范圍 alert("RangeError"); } else if (error instanceof SyntaxError) { //語(yǔ)法錯(cuò)誤,錯(cuò)誤發(fā)生在eval(), alert("SyntaxError"); } else if (error instanceof TypeError) { //變量類(lèi)型不是預(yù)期的 alert("TypeError"); } else if (error instanceof URIError) { //錯(cuò)誤發(fā)生在encodeURI()或decodeURI()中 alert("URIError"); } } } run(); </script>
語(yǔ)法:throw exception;
exception 可以是任何類(lèi)型的數(shù)據(jù) 如:
throw 12345;
throw 'hello';
throw true;
throw {name:'Joel',age:20};
使用throw語(yǔ)句來(lái)拋出一個(gè)自定義異常 如:
<script> function see(){ try { if(true){ throw new Error("my eroor!"); } } catch (error) { console.log(error.name );//Error console.log(error.message);//my eroor! console.log(error.stack);//Error: my eroor! at see (try.html:12) at try.html:22 } } see(); </script>
當(dāng)執(zhí)行的javascript代碼中出現(xiàn)錯(cuò)誤的時(shí)候,js引擎就會(huì)根據(jù)js的調(diào)用棧逐級(jí)尋找對(duì)應(yīng)的catch,如果沒(méi)有找到相應(yīng)的catch handler或者本身又有error或者又拋出新的error,最后就會(huì)把這個(gè)error的處理交給瀏覽器,瀏覽器會(huì)用各自不同的方式(IE以黃色三角圖案顯示在左下角,而firefix會(huì)顯示在錯(cuò)誤控制臺(tái)中)顯示錯(cuò)誤信息給用戶(hù);
任何沒(méi)有通過(guò)tyr-catch處理的錯(cuò)誤都會(huì)觸發(fā)window對(duì)象的error事件 如:
<script> window.onerror= function (msg,url,l) { console.log(msg)//Uncaught ReferenceError: a is not defined console.log(url)//http://localhost:63342/person_Project/js_demo/onerror.html console.log(l)//17 } function run(){ console.log(a) } run() </script>
window.onerror 事件接收三個(gè)參數(shù):msg 錯(cuò)誤消息、url 發(fā)生錯(cuò)誤的頁(yè)面的 url 、line 發(fā)生錯(cuò)誤的代碼行。
有了try catch 捕獲的錯(cuò)誤對(duì)象加上window.onerror 全局監(jiān)聽(tīng)錯(cuò)誤事件,那么前端js代碼錯(cuò)誤監(jiān)控變的太簡(jiǎn)單了
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com