javascript 之異常處理try catch finally--05


語法結構

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代碼錯誤監控變的太簡單了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM