語法結構 try catch finally是ECMAScript-262 第三版提供異常處理機制的標準,語法結構如下: 語法與大多數語言一樣 如java .net,如果try{}代碼塊捕獲到了異常,那麼catch塊會得到一個錯誤信息對象(Error 的實例)。 我們應該把有可能發生錯誤的代碼放在t ...
語法結構
try catch finally是ECMAScript-262 第三版提供異常處理機制的標準,語法結構如下:
1 try{ 2 //可能會發生的錯誤代碼 3 } 4 catch(error){ 5 //錯誤處理 6 }finally{ 7 //無論是否有異常都會執行 8 }
語法與大多數語言一樣 如java .net,如果try{}代碼塊捕獲到了異常,那麼catch塊會得到一個錯誤信息對象(Error 的實例)。
我們應該把有可能發生錯誤的代碼放在try塊中,而錯誤處理在catch塊中;在js中如果<script></script>代碼塊中發生了錯誤且沒有進行捕獲異常處理,那麼當前<script>代碼塊後續的代碼是不會執行的 ,但是不會影響到其他<script></script>代碼塊代碼如:
1 <script> 2 function run(){ 3 console.log(age); 4 } 5 run(); 6 console.log('可以輸出嗎?');//沒有執行 7 </script> 8 9 <script> 10 console.log('這是第二個代碼塊');//執行了,這是第二個代碼塊 11 </script>
反之後續的代碼還是會執行 如:
1 <script> 2 function run(){ 3 try{ 4 console.log(age); 5 }catch(error){ 6 7 } 8 9 } 10 run(); 11 console.log('可以輸出嗎?');//可以輸出嗎? 12 </script> 13 14 <script> 15 console.log('這是第二個代碼塊');//這是第二個代碼塊 16 </script>
finally語句
如果存在finally代碼塊,那麼不管什麼原因裡面的代碼都會執行,甚至是catch 語句中有return語句 如下代碼:
function say() { try { console.log(age) return; } catch (erroe) { console.log(erroe.message);//age is not defined return; } finally { console.log('finally 執行了');//finally 執行了 } } say();
認識Error 類型
當代碼運行時發生錯誤,會創建一個Error對象,並將其拋出,這個對象包含了錯誤的描述信息。
如在 try...catch(error){...} 語句中Error 是Error類型拋出的對象,該對象有三個基本的屬性name 錯誤名稱,message 錯誤信息,stack 錯誤棧信息;
執行代碼期間可能會發生的錯誤有多種類型,所以Error 又派生了幾個兒子 如:
Error Error 類型的錯誤很少見,如果有也是瀏覽器拋出的;這個基類型的主要目的是供開發人員拋出自定義錯誤。
EvalError 創建一個error實例,表示錯誤的原因:與 eval() 有關。
InternalError 創建一個代表Javascript引擎內部錯誤的異常拋出的實例。 如: "遞歸太多".
RangeError 創建一個error實例,表示錯誤的原因:數值變數或參數超出其有效範圍。
ReferenceError 創建一個error實例,表示錯誤的原因:無效引用。
SyntaxError 創建一個error實例,表示錯誤的原因:eval()在解析代碼的過程中發生的語法錯誤。
TypeError 創建一個error實例,表示錯誤的原因:變數或參數不屬於有效類型。
URIError 創建一個error實例,表示錯誤的原因:給 encodeURI()或 decodeURl()傳遞的參數無效。
Error 是基類,其他錯誤類型都是繼承自Error類型,所以子類也就具備了三個基本的屬性name 錯誤名稱,message 錯誤信息,stack 錯誤棧信息。
有了這些錯誤類型我們就可以寫類似這樣的代碼,通過判斷異常的類型來特定處理某一類的異常 如:
1 <script> 2 function run() { 3 try { 4 say("hello word"); 5 } 6 catch (error) { 7 for (var p in error) { 8 document.writeln(error[p]); 9 } 10 //上面可以遍歷錯誤 11 if (error instanceof EvalError) { 12 //如果非法調用了eval()函數,則會拋出EvalError的異常。 13 alert("EvalError"); 14 } else if (error instanceof ReferenceError) { 15 //錯誤的引用,此例子是執行到了本步。 16 alert("ReferenceError"); 17 } else if (error instanceof RangeError) { 18 //數值超出了範圍 19 alert("RangeError"); 20 } else if (error instanceof SyntaxError) { 21 //語法錯誤,錯誤發生在eval(), 22 alert("SyntaxError"); 23 } else if (error instanceof TypeError) { 24 //變數類型不是預期的 25 alert("TypeError"); 26 } else if (error instanceof URIError) { 27 //錯誤發生在encodeURI()或decodeURI()中 28 alert("URIError"); 29 } 30 } 31 } 32 run(); 33 </script>
throw拋出自定義錯誤類型
語法:throw exception;
exception 可以是任何類型的數據 如:
throw 12345;
throw 'hello';
throw true;
throw {name:'Joel',age:20};
使用throw語句來拋出一個自定義異常 如:
1 <script> 2 function see(){ 3 try { 4 if(true){ 5 throw new Error("my eroor!"); 6 } 7 8 } catch (error) { 9 console.log(error.name );//Error 10 console.log(error.message);//my eroor! 11 console.log(error.stack);//Error: my eroor! at see (try.html:12) at try.html:22 12 } 13 } 14 see(); 15 </script>
Javascript的異常處理機制
當執行的javascript代碼中出現錯誤的時候,js引擎就會根據js的調用棧逐級尋找對應的catch,如果沒有找到相應的catch handler或者本身又有error或者又拋出新的error,最後就會把這個error的處理交給瀏覽器,瀏覽器會用各自不同的方式(IE以黃色三角圖案顯示在左下角,而firefix會顯示在錯誤控制臺中)顯示錯誤信息給用戶;
window.onerror
任何沒有通過tyr-catch處理的錯誤都會觸發window對象的error事件 如:
1 <script> 2 window.onerror= function (msg,url,l) 3 { 4 console.log(msg)//Uncaught ReferenceError: a is not defined 5 console.log(url)//http://localhost:63342/person_Project/js_demo/onerror.html 6 console.log(l)//17 7 } 8 9 function run(){ 10 console.log(a) 11 } 12 run() 13 </script>
window.onerror 事件接收三個參數:msg 錯誤消息、url 發生錯誤的頁面的 url 、line 發生錯誤的代碼行。
前端代碼異常監控方案
有了try catch 捕獲的錯誤對象加上window.onerror 全局監聽錯誤事件,那麼前端js代碼錯誤監控變的太簡單了。