整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          javascript 異常處理的一些經驗

          javascript 異常處理的一些經驗

          介: 為了提升應用穩定性,我們對前端項目開展了腳本異常治理的工作,對生產上報的js error進行了整體排查,試圖通過降低腳本異常的發生頻次來提升相關告警的準確率,結合最近在這方面閱讀的相關資料,嘗試階段性的做個總結,下面我們來介紹下js異常處理的一些經驗。

          作者 | 肖榮強(路遷)

          來源 | 阿里開發者公眾號


          寫在前面

          為了提升應用穩定性,我們對前端項目開展了腳本異常治理的工作,對生產上報的js error進行了整體排查,試圖通過降低腳本異常的發生頻次來提升相關告警的準確率,結合最近在這方面閱讀的相關資料,嘗試階段性的做個總結,下面我們來介紹下js異常處理的一些經驗。


          先說概念
          什么是異常

          先來看一下官方的定義:

          Error objects are thrown when runtime errors occur. The Error object can also be used as a base object for user-defined exceptions.


          描述的很簡單,我們總結一下就是代碼在執行過程中遇到了問題,程序已經無法正常運行了,Error對象會被拋出,這一點它不同于大部分編程語言里使用的異常對象Exception,甚至更適合稱之為錯誤,應該說事實也確實如此,Error對象在未被拋出時候和js里其他的普通對象沒有任何差別是不會引發異常的,同時Error 對象也可用于用戶自定義錯誤的基礎對象。

          看下面兩個例子:


          ↓↓↓執行結果↓↓↓


          結論:只有在執行過程中的異常可以被捕獲,語法解析階段的異常或者不在當前同步任務中的異常都無法被捕獲。


          ↓↓↓執行結果↓↓↓

          以上紅色信息里包含了異常信息(message)和棧跟蹤(stack trace)信息,對于定位代碼中的問題起到重要作用,可以看到棧跟蹤是從底部文件位置21:15到頂部25:7位置的;前兩個console在遇到異常時候未被執行,第二個script標簽內的代碼被正常執行。

          結論:當任務執行過程中出現未處理的異常,會一直沿著調用棧一層層向外拋出(有點像事件冒泡),最終會導致當前任務被終止執行。當前任務終止后JS 線程會繼續從任務隊列中提取下一個任務繼續執行。


          異常的類型

          錯誤名

          描述

          示例

          EvalError

          關于 eval [1]函數的錯誤,已不在當前ECMAScript規范中使用,不再會被運行時拋出。

          throw new EvalError('EvalError', 'file.js', 10); // 可以由業務代碼主動拋出

          RangeError

          值不在允許的范圍內,典型的是試圖傳遞一個數值給一個范圍內不包含該數值的函數,此時應該引發RangeError。

          const numObj=123;numObj.toFixed(-1); // Uncaught RangeError: toFixed() digits argument must be between 0 and 100 at Number.toFixed

          ReferenceError

          當一個不存在(或尚未初始化)的變量被引用時發生的錯誤。

          const a=undefinedVariable; // Uncaught ReferenceError: undefinedVariable is not defined

          SyntaxError

          解析代碼階段,發現了不符合語法規范的代碼。

          const 111variable=1; // Uncaught SyntaxError: Invalid or unexpected token

          TypeError

          類型錯誤,用來表示值的類型是非預期類型。

          const a=null;a.doSomeThing(); // Uncaught TypeError: Cannot read properties of null (reading 'doSomeThing')

          URIError

          使用URI處理函數產生的錯誤

          decodeURIComponent('%') // U


          點擊鏈接查看原文,獲取更多福利!

          https://developer.aliyun.com/article/1058117?groupCode=alitech?utm_content=g_1000361548


          版權聲明:本文內容由阿里云實名注冊用戶自發貢獻,版權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻刪除涉嫌侵權內容。

          異常的概念:程序在運行過程中出現的錯誤 (最大的特征:一旦代碼出現異常 其后的代碼就不再執行)
          

          在js中出現異常后,瀏覽器會給出一段錯誤碼,就是錯誤信息,錯誤消息由錯誤類型與錯誤詳細點構成

          錯誤類型:

          1.Error:error構造函數創建一個錯誤對象,如果程序運行環境出現錯誤,就會拋出一個該錯誤類型的實例對象,除此之外該類型還支持用戶自定義錯誤類型

          2.TypeError:如果代碼訪問的數據類型錯誤 拋出異常

          3.ReferenceError:當訪問的變量不存在的時候 拋出異常

          4.SyntaxError:當語法錯誤的時候 拋出異常

          5.URIError:當前調用URI相關函數時出現錯誤 拋出異常

          6.EvalError:當非法調用eval函數的時候 拋出異常

          7.RangeError:當數組等類型的方位非法使用的時候 拋出異常

          ##如何處理異常
          

          就是要出現異常后 還能繼續執行

          常見的異常有兩大類:

          a.運行環境的多樣性

          b.代碼錯誤 語法錯誤

          try-catch語法: 即嘗試這么做,如果出現錯誤捕獲錯誤

          try{

          可能出現錯誤的代碼

          }

          常概念

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8"/>

          <title>處理異常</title>

          </head>

          <body>

          </body>

          <script>

          try{

          console.log(abc);

          }catch (e) {

          console.log('對不起你的代碼有錯');

          console.log(e);

          }

          var a="正常執行"

          console.log(a);

          console.log(a);

          console.log(a);

          console.log(a);

          console.log(a);

          console.log(a);

          </script>

          </html>

          輸出結果

          拋出異常代碼:

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8"/>

          <title>拋出異常</title>

          </head>

          <body>

          </body>

          <script>

          console.log(1);

          console.log(2);

          try{

          o1=new Error('我是一個自定義的拋出異常');

          throw o1;

          } catch(e) {

          console.log( e===o1);

          }

          console.log(3);

          console.log(4);

          console.log(5);

          console.log(6);

          </script>

          </html>

          輸出結果

          常見錯誤:


          主站蜘蛛池模板: 在线观看一区二区精品视频| 欧美一区内射最近更新| 国产一区二区三区福利| 精品一区二区久久久久久久网精| 精品动漫一区二区无遮挡| 成人在线一区二区| 一区二区三区www| 一区二区三区杨幂在线观看| 激情综合一区二区三区| 国产一区内射最近更新| 国产在线精品一区二区高清不卡 | 国产一区二区精品在线观看| 久久久久无码国产精品一区 | 精品国产一区二区三区不卡| 日韩精品无码视频一区二区蜜桃| 亚洲av无码一区二区三区人妖| 日韩一区二区视频在线观看| 69久久精品无码一区二区| 国产成人久久精品区一区二区| 亚洲熟女综合一区二区三区| 成人一区二区三区视频在线观看| 亚洲国产系列一区二区三区| 天美传媒一区二区三区| 国产一区二区三区在线观看免费 | 性无码一区二区三区在线观看| 国产视频福利一区| 日韩精品一区二区三区中文字幕 | 无码少妇一区二区三区芒果| 无码国产伦一区二区三区视频 | 日韩AV在线不卡一区二区三区| 无码人妻精品一区二区三| 无码一区二区三区中文字幕| 精品人妻一区二区三区四区在线 | 伊人色综合一区二区三区| 麻豆一区二区三区蜜桃免费| 伊人精品视频一区二区三区| 久久青草精品一区二区三区| 亚洲中文字幕乱码一区| 亚洲中文字幕无码一区 | 99热门精品一区二区三区无码 | 日本丰满少妇一区二区三区|