若是debug是移除bug的流程,那麼編程就必定是將bug放進去的流程。
若是沒有用戶反饋問題,那就表明咱們的產品棒棒噠,對不對?
ECMAScript exceptions <==> IDL 的簡單異常前端
當腳本代碼運行時發生的錯誤,會建立Error對象,並將其拋出,除了通用的Error構造函數外,如下是另外幾個ECMAScript 2015中定義的錯誤構造函數。git
DOMException 最新的DOM規範定義的錯誤類型集,兼容舊瀏覽的DOMError接口, 完善和規範化DOM錯誤類型。github
[x] 資源加載異常web
[x] 異步請求異常編程
[ ] CSS中資源異常segmentfault
try-catch (ES提供基本的錯誤捕獲語法)後端
window.onerror = cb (DOM0)跨域
將能引起異常的代碼塊放到try中,並對應一個響應,而後有異常會被捕獲promise
try { // 模擬一段可能有錯誤的代碼 throw new Error("會有錯誤的代碼塊") } catch(e){ // 捕獲到try中代碼塊的錯誤獲得一個錯誤對象e,進行處理分析 report(e) } finally { console.log("finally") }
當JavaScript運行時錯誤(包括語法錯誤)發生時,window會觸發一個ErrorEvent接口的事件,並執行window.onerror();瀏覽器
但這裏有個信息要注意,語法錯誤會致使出現語法錯誤的那個腳本塊執行失敗,因此語法錯誤會致使當前代碼塊運行終止,從而致使整個程序運行中斷,若是語法錯誤這個發生在咱們的錯誤監控語句塊中,那麼咱們就什麼也監控不到了。
/** * @description 運行時錯誤處理器 * @param {string} message 錯誤信息 * @param {string} source 發生錯誤的腳本URL * @param {number} lineno 發生錯誤的行號 * @param {number} colno 發生錯誤的列號 * @param {object} error Error對象 */ function err(message,source,lineno,colno,error) {...} window.onerror = err
當一項資源(如<img>
或<script>
)加載失敗,加載資源的元素會觸發一個Event接口的error事件,並執行該元素上的onerror()處理函數。
element.onerror = function(event) { ... } //注意和window.onerror的參數不一樣
注意:這些error事件不會向上冒泡到window,不過能被單一的window.addEventListener捕獲。
W3C DOM2 Events規範中提供的註冊事件監聽器的方法, 在這以前均使用el.onclick
的形式(DOM0 規範的基本內容,幾乎全部瀏覽器都支持)。
注意: 接口的幾種語法
資源加載失敗,不會冒泡,可是會被addEventListener捕獲,因此咱們能夠指定在加載失敗事件的捕獲階段捕獲該錯誤。
注意: 接口同時也能捕獲運行時錯誤。
window.addEventListener("error", function(e) { var eventType = [].toString.call(e, e); if (eventType === "[object Event]") { // 過濾掉運行時錯誤 // 上報加載錯誤 report(e) } }, true );
最新的規範中定義了 unhandledrejection事件用於全局捕獲promise對象沒有rejection處理器時異常狀況。
window.addEventListener("unhandledrejection", function (event) { // ...your code here to handle the unhandled rejection... // Prevent the default handling (error in console) event.preventDefault(); });
Promise中的錯誤會被Promise.prototype.catch捕獲,因此咱們經過這種方式捕獲錯誤,這包括一些不支持unhandledrejection事件的環境中promisede polyfill實現。
new Promise(function(resolve, reject) { throw 'Uncaught Exception!'; }).catch(function(e) { console.log(e); // Uncaught Exception! });
// 覆寫XMLHttpRequest API if(!window.XMLHttpRequest) return; var xmlhttp = window.XMLHttpRequest; var _oldSend = xmlhttp.prototype.send; var _handleEvent = function (event) { if (event && event.currentTarget && event.currentTarget.status !== 200) { report(event) } } xmlhttp.prototype.send = function () { if (this['addEventListener']) { this['addEventListener']('error', _handleEvent); this['addEventListener']('load', _handleEvent); this['addEventListener']('abort', _handleEvent); this['addEventListener']('close', _handleEvent); } else { var _oldStateChange = this['onreadystatechange']; this['onreadystatechange'] = function (event) { if (this.readyState === 4) { _handleEvent(event); } _oldStateChange && _oldStateChange.apply(this, arguments); }; } return _oldSend.apply(this, arguments); } // 覆寫fetch API if (!window.fetch) return; var _oldFetch = window.fetch; window.fetch = function() { return _oldFetch .apply(this, arguments) .then(function(res){ if (!res.ok) { // True if status is HTTP 2xx report(res) } return res; }) .catch(function(error){ report(res) }); }
img請求上報, url參數帶上錯誤信息
eg:(new Image()).src = 'http://baidu.com/tesjk?r=tksjk'
當加載自不一樣域的腳本中發生語法錯誤時,爲避免信息泄露,語法錯誤的細節將不會報告,而代之簡單的 "Script error."
因爲同源策略影響,瀏覽器限制跨源腳本的錯誤訪問,這樣跨源腳本錯誤報錯信息以下圖:
在H5的規定中,只要知足下面倆個條件,是容許獲取跨源腳本的錯誤信息的。
代碼質量體系控制和錯誤監控以及性能分析
若是用戶使用網頁,發現白屏,如今聯繫上了大家,大家會向他詢問什麼信息呢?先想一下爲何會白屏?
咱們以用戶訪問頁面的過程爲順序,大體排查一下
經過以上可能發生錯誤的環節,咱們須要向用戶手機一下如下的用戶信息
Web規範中相關前端異常
異常按照捕獲方式分類
異常的捕獲方式
try-catch (ES提供基本的錯誤捕獲語法)
window.onerror = cb (DOM0)
注意點:跨源腳本異常的捕獲
日誌上報的方式
擴展閱讀
==========12月13日修正===========語法錯誤的捕獲有些特殊,通常狀況下,語法錯誤在開發階段就會報錯,很容易解決。可是若是在上線以後程序運行在不兼容的環境中也可能存在語法錯誤,引用的外部腳本存在語法錯誤等狀況,咱們就能夠捕獲到一個包含錯誤信息的錯誤對象,而不只僅是「Uncaught SyntaxError: Invalid or unexpected token」