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

来源:http://www.cnblogs.com/CandyManPing/archive/2017/10/26/7734322.html
-Advertisement-
Play Games

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:觀察者模式簡單介紹 觀察者模式又稱為發佈-訂閱模式(publish/subscribe),該模式定義了一種,一對多的依賴關係,讓多個觀察者同時監聽一個主題對像,這個主題對像在狀態發生改變時,會通知所有的觀察者對像更新(執行業務邏輯)。示意圖如下: 觀察者角色介紹: 1:抽像主題角色(Subjec ...
  • 題目1:幾個同事為了在上班期間偷偷看休息,做點其他的事情,就和小秘偷偷聯繫了一下,如果老闆回來了,就麻煩小秘偷偷通知一聲,這樣方便大家及時變更自己的工作狀態。 分析: 根據題目分析,首先明確,肯定會有兩個類:小秘類和同事類,分別描述與記錄兩種類型的人和行為。 需要註意的是:小秘與同事構建聯繫的時候, ...
  • 經驗與實踐 前兩篇文章里我們介紹了nxlog的日誌收集和轉發《ELK系列~Nxlog日誌收集加轉發(解決log4日誌換行導致json轉換失敗問題)》,今天我們主要總結一下,在與log4和fluentd及elasticsearch配合工作時需要註意的幾個點,這幾個點也是我們經常遇到的坑,希望可以幫到大 ...
  • 設計模式(0)簡單工廠模式 設計模式(1)單例模式(Singleton) 設計模式(2)工廠方法模式(Factory Method) 設計模式(3)抽象工廠模式(Abstract Factory) 設計模式(4)建造者模式/生成器模式(Builder) 源碼地址 0 原型模式簡介 0.0 原型模式定 ...
  • Php常見錯誤提示 一、Fatal error: Call to undefined function……函數不存在,可能的原因:系統不存在這個函數且你也沒自定義 二、syntax error, unexpected T_STRING, expecting……嚴重語法錯誤,例如syntax erro ...
  • 本文章將會繼承上一篇文章,主要講通過工具來進行日誌的收集與發送,《ELK系列~NLog.Targets.Fluentd到達如何通過tcp發到fluentd》 Nxlog是一個日誌收集工具,它將系統日誌,或者指定的日誌文件,統配符文件找到,然後加工,最後發送到目標位置。而目標位置有很多種,如文件系統, ...
  • 使用語法 首先我們先來看一個例子:html代碼: css代碼: 實現效果: 結果是該DOM元素背景變成了黑色。 CSS中原生的變數定義語法是:--*,變數使用語法是:var(--*),其中*表示我們的變數名稱。關於命名這個東西,各種語言都有些顯示,例如CSS選擇器不能是數字開頭,JS中的變數是不能直 ...
  • 一、介紹 沒錯,這是第五篇,到了引用類型,這次要分成兩次博文了,太多內容了,這是前篇,篇幅很長也很多代碼,主要講引用類型和常用的引用類型,代碼試驗過的,老鐵沒毛病。 堅持看堅持寫,不容易不容易,希望大家能在這博客中學到東西。能和大家分享,不錯不錯。而且啊,我想通過自己的認識,思考來得到一些個人見解, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...