成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端一站式異常監控捕獲方案

開發 前端
在服務器開發中,我們常常使用日志來記錄請求的錯誤和服務器異常問題,但是在客戶端,前端應用直接部署運行在用戶的瀏覽器中,如果發生錯誤,應該怎樣去捕獲并傳送給服務器呢?前端錯誤日志傳送給服務器很簡單,在異常發生時直接發請求就可以了,下面我們主要討論下錯誤的捕獲方案。

【引自ouven的博客】一、前端異常監控的重要性

軟件異常監控常常直接關聯到軟件本身的質量,完備的異常監控體系常常能夠快速定位到軟件運行中發生的問題,并能幫助我們快速定位異常的源頭,提升軟件質量。

在服務器開發中,我們常常使用日志來記錄請求的錯誤和服務器異常問題,但是在客戶端,前端應用直接部署運行在用戶的瀏覽器中,如果發生錯誤,應該怎樣去捕獲并傳送給服務器呢?前端錯誤日志傳送給服務器很簡單,在異常發生時直接發請求就可以了,下面我們主要討論下錯誤的捕獲方案。

二、現有的異常監控方案

  • window.onerror全局異常捕獲   目前前端捕獲頁面異常的方式主要有兩種,window.onerror捕獲整個頁面中運行的錯誤,它的局限是對于跨域的JavaScript腳本需要添加跨域支持,也就是需要涉及服務器的修改成本,否則無法獲取到運行時具體的堆棧錯誤信息,而是"script error"的信息,不利于我們定位問題。
  1. window.onerror = function(msg, file, row, column, errorObj) { 
  2.     console.log(msg); // script error. 
  3.     console.log(file); //  
  4.     console.log(row); // 0 
  5.     console.log(column); // 0 
  6.     console.log(errorObj); // {} 
  7.     setTimeout(function() { 
  8.         // 發送請求上報日志信息 
  9.         errorReport(e.name, e.message + e.stack); 
  10.     }, 5000); 
  11.  
  1. <script src="//domain.com/path/main.js" crossorigin></script> 
  • try-catch運行時解決方案

  現有的另一中方案則是try-catch,對于某個方法函數,我們可以這樣定義來捕獲函數里面運行時的異常,但是try-catch只能捕獲當前單個作用域下的異常。另外,使用try-catch會帶來一定的性能損耗,根據循環測試,平均大概會損失6%~10%的性能,但是為了提升應用的質量和穩定性,這些是可以接受的。 

  1. function wrapFunction(fn) { 
  2.     return function() { 
  3.         try { 
  4.             return fn.apply(this, arguments); 
  5.         } catch (e) { 
  6.             console.log(e); 
  7.             _errorProcess(e); 
  8.             return
  9.         } 
  10.     }; 
  11.  
  12. // 之后fn函數里面的代碼運行出錯時則是可以被捕獲到的了 
  13. fn = wrapFunction(fn); 
  14.  
  15. // 或者異步函數里面的回調函數中的錯誤也可以被捕獲到 
  16. var _setTimeout = setTimeout; 
  17. setTimeout = function(fn, time){ 
  18.     return _setTimeout(wrapFunction(fn), time); 
  19.  
  20. // 模塊定義函數也可以做重寫定義 
  21. var _require = require; 
  22. require = function(id, deps, factory) { 
  23.     if (typeof(factory) !== 'function' || !factory) { 
  24.         return _require(id, deps); 
  25.     } else { 
  26.         return _require(id, deps, wrapFunction(factory)); 
  27.     } 
  28. };  

那么我們可以對常用的模塊入口函數進行重定義,包括define,require等,這樣模塊中的主要作用域中的異常都可以通過try-catch來捕獲了。在之前的處理方法中,這種方法是非常有效的,直接可以拿到大多數錯誤棧中的異常和堆棧信息。

三、改進的一站式解決方案

React開發時代,這種方式就不能直接使用了,我們知道React的組件都是class,其實也就是構造函數,這里普及下class和構造函數其實是非常類似的,class A除了constructor為class A,其它信息和function A類似,typeof獲取的類型也相同。但是我們是沒辦法把構造函數A直接裝入try-catch中運行的,因為需要通過關鍵字new進行實例化,并創建新的作用域。 

    

 

此時我們要處理的問題其實是捕獲React中屬性方法中的錯誤,應該還記得,JavaScript中函數有個特殊的屬性prototype,當函數作為構造函數是,prototype中的屬性就成了實例化后的屬性方法,而且這一屬性對class同樣生效。那么我們可以對React中class的prototype這個特殊屬性的內容進行處理,對Component中的方法函數進行封裝。

  1. function defineReact(Component) { 
  2.  
  3.     var proto = Component.prototype; 
  4.  
  5.     for (var key in proto) { 
  6.         if (typeof(proto[key]) === 'function') { 
  7.             proto[key] = _wrapFunction(proto[key]); 
  8.         } 
  9.     } 
  10.  
  11.     return Component; 
  12.  

這樣通過實例化產生的React組件中的內部方法中的錯誤就可以被捕獲到了。 

  1. class component extends React.Component { 
  2.     componentDidMount(){ 
  3.         var a = {}; 
  4.         console.log(a.b.c); 
  5.     } 
  6.     render() { 
  7.         return <div>hello world</div>; 
  8.     } 
  9. export default defineReact(component);  

這里添加defineReact的操作就可以放到構建打包工具中去處理了,這樣就避免了我們對代碼層直接進行修改。 

 

React直接報錯不利于定位問題   

 

封裝后直接獲取堆棧錯誤 

四、小結

  小結一下,其實和原有的方式差別不大,仍然通過try-catch的方式,覆蓋到React組件prototype屬性中進行異常捕獲,極大增加了錯誤捕獲范圍,不僅能幫助我們快速定位開發中的問題,也能捕獲React線上應用的運行時錯誤。 

責任編輯:龐桂玉 來源: ouven的博客
相關推薦

2024-08-19 09:05:00

Seata分布式事務

2010-05-06 16:02:26

2021-03-16 17:51:03

戴爾

2013-06-14 09:30:52

2013-10-20 13:30:07

華為一站式BYOD敏捷辦公

2015-04-19 16:36:10

騰訊云

2013-12-12 15:34:00

Moneta移動支付一站式解決方案

2015-12-15 17:33:57

戴爾云計算

2009-07-30 21:16:29

布線服務電纜架設

2022-09-16 11:27:46

建設微服務

2009-10-23 09:42:24

2023-10-26 06:59:58

FinOps云原生

2017-11-28 13:53:18

2023-05-26 08:37:04

All in ECPES數據

2015-02-02 11:06:21

cocos cocos一站式解決

2012-04-09 17:36:38

華為智真

2013-10-24 17:35:01

云網絡H3C電子政務

2009-07-27 11:37:04

網絡拓撲摩卡

2021-12-07 10:04:34

Azure Kuber場景應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91免费版在线观看 | 欧美在线国产精品 | 六月色婷 | 欧美日韩精品中文字幕 | www.色五月.com | 午夜黄色 | 色播视频在线观看 | 在线观看特色大片免费网站 | 日韩av一二三区 | 欧美精品一区二区三区四区 在线 | 中文字幕第一页在线 | 亚洲高清视频在线观看 | 国产精品成人69xxx免费视频 | 欧美日韩精品 | 日韩免费一区二区 | 韩日一区| 亚洲欧美日韩国产 | 精品国产乱码久久久久久闺蜜 | 久久久久久久久久久久久9999 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 久久久久久国产精品 | 91亚洲精选 | 亚洲精品视频一区 | 黄色免费在线观看 | 午夜影院中文字幕 | 精品国产乱码久久久久久闺蜜 | 91视频在线看 | 蜜桃视频麻豆 | 在线成人| 在线第一页 | 天天搞夜夜操 | 91porn成人精品 | 亚洲91精品| 欧美日韩国产中文字幕 | 久久精品视频免费观看 | 中文字幕日本一区二区 | 区一区二在线观看 | 欧美一级在线观看 | www.久久99 | 欧美日韩在线一区二区 | 欧美乱做爰xxxⅹ久久久 |