摘要:捕獲分為兩個方面收集語法執(zhí)行錯誤最初的是想直接獲取控制臺的錯誤信息然而這并不大可行,并沒有這樣的功能。
這個不是很常用的功能, 但是想收集客戶端的錯誤信息時卻很有必要了解下。 捕獲分為兩個方面:收集JS語法、執(zhí)行錯誤
最初的是想直接獲取控制臺的錯誤信息; 然而這并不大可行,JS并沒有這樣的功能。
轉(zhuǎn)換下思路
在錯誤發(fā)生時,將錯誤進(jìn)行存儲。
原生JS實(shí)現(xiàn)方式:通過重載 window 對象下的 onerror 函數(shù), 可以截取到這些信息。
window.onerror = function(errorMessage, scriptURI, lineNumber,columnNumber,errorObj) { console.log("錯誤信息:" , errorMessage); console.log("出錯文件:" , scriptURI); console.log("出錯行號:" , lineNumber); console.log("出錯列號:" , columnNumber); console.log("錯誤詳情:" , errorObj); }框架實(shí)現(xiàn)方式:
只在angular 下做了實(shí)現(xiàn),沒有實(shí)現(xiàn)過的框架沒有發(fā)言權(quán);接下來將以angular為例。但要注意的是在部分框下這種方式是不生效的,原因是在框架解析代碼前,所有的代碼可以理解為都是文本而非js文件。
angular 環(huán)境下無法使用window.ondrror. 原因是angular體制內(nèi)的代碼通過$even 解析后并不會將錯誤移交給 window.onerror 函數(shù)
但是 angular 在解析時會將所有的語法、執(zhí)行錯誤時將會觸發(fā) $ExceptionHandlerProvider 函數(shù):
function $ExceptionHandlerProvider() { this.$get = ["$log", function($log) { return function(exception, cause) { $log.error.apply($log, arguments); }; }]; }
$ExceptionHandlerProvider 函數(shù)將會調(diào)用 consoleLog("error") 函數(shù)
this.$get = ["$window", function($window) { return { /** * @ngdoc method * @name $log#log * * @description * Write a log message */ log: consoleLog("log"), /** * @ngdoc method * @name $log#info * * @description * Write an information message */ info: consoleLog("info"), /** * @ngdoc method * @name $log#warn * * @description * Write a warning message */ warn: consoleLog("warn"), /** * @ngdoc method * @name $log#error * * @description * Write an error message */ error: consoleLog("error"), /** * @ngdoc method * @name $log#debug * * @description * Write a debug message */ debug: (function() { var fn = consoleLog("debug"); return function() { if (debug) { fn.apply(self, arguments); } }; }()) }; function consoleLog(type) { var console = $window.console || {}, logFn = console[type] || console.log || noop, hasApply = false; // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. // The reason behind this is that console.log has type "object" in IE8... try { hasApply = !!logFn.apply; } catch (e) {} if (hasApply) { return function() { var args = []; forEach(arguments, function(arg) { args.push(formatError(arg)); }); return logFn.apply(console, args); }; } // we are IE which either doesn"t have window.console => this is noop and we do nothing, // or we are IE where console.log doesn"t have apply so we log at least first 2 args return function(arg1, arg2) { logFn(arg1, arg2 == null ? "" : arg2); }; }
最終這些錯誤會流入原生console.error內(nèi), 所以在angular下捕獲這些錯誤將變的異常簡單。僅僅需要重置console.error方法,如下所示:
resetConsole() { window.console._error = window.console.error; window.console.error = info => { // 在這里執(zhí)行錯誤存儲或發(fā)送 window.console._error(info); }; }
angular 在解析錯誤時, 會通過$log.error.apply $window.console.error方法. 所以在這里將 console.error 進(jìn)行重置后, 語法、執(zhí)行錯誤也會一并收集到。
收集請求錯誤各框架都會將 XMLHttpRequest 進(jìn)行封裝, 可以找到對應(yīng)的errror函數(shù)內(nèi)將錯誤進(jìn)行捕獲。
原生實(shí)現(xiàn)收集請求錯前, 需要先對XMLHttpRequest進(jìn)行封裝,示例如下:
var ajax = function(type, url, callback){ var xhr = new XMLHttpRequest(); xhr.open(type, url); xhr.onreadystatechange = function() { if (xhr.readyState !== 4) { return; } if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { callback(); } else { console.log("收集到一條錯誤");// 在這里收集錯誤信息 } }; xhr.send(null); } // 因?yàn)?ccccccom這個路徑是不存在的, 所以會執(zhí)行收集區(qū)域的代碼。 ajax("GET", "http://www.lovejavascript.ccccccom", function(a){console.log(a)});
如果對 XMLHttpRequest 封裝感興趣, 可以看下我寫的 jTool類庫中的 ajax 對象
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/109715.html
摘要:前言做好錯誤監(jiān)控,將用戶使用時的錯誤日志上報,可以幫助我們更快的解決一些問題。一個變通方案是單獨(dú)處理,告知錯誤詳情僅能通過瀏覽器控制臺查看,無法通過訪問。 前言 做好錯誤監(jiān)控,將用戶使用時的錯誤日志上報,可以幫助我們更快的解決一些問題。目前開源的比較好的前端監(jiān)控有 https://docs.sentry.io/ 那前端監(jiān)控是怎么實(shí)現(xiàn)的呢?要想了解這個,需要知道前端錯誤大概分為哪些以及如...
摘要:錯誤上報機(jī)制發(fā)送數(shù)據(jù)因?yàn)檎埱蟊旧硪灿锌赡軙l(fā)生異常,而且有可能會引發(fā)跨域問題,一般情況下更推薦使用動態(tài)創(chuàng)建標(biāo)簽的形式進(jìn)行上報。 js錯誤捕獲 js錯誤的實(shí)質(zhì),也是發(fā)出一個事件,處理他 error實(shí)例對象 對象屬性 message:錯誤提示信息 name:錯誤名稱(非標(biāo)準(zhǔn)屬性)宿主環(huán)境賦予 stack:錯誤的堆棧(非標(biāo)準(zhǔn)屬性)宿主環(huán)境賦予 對象類型(7種) Synt...
摘要:二需要處理哪些異常對于前端來說,我們可做的異常捕獲還真不少。總結(jié)一下,大概如下語法錯誤代碼異常請求異常靜態(tài)資源加載異常異常異常跨域崩潰和卡頓下面我會針對每種具體情況來說明如何處理這些異常。 前端一直是距離用戶最近的一層,隨著產(chǎn)品的日益完善,我們會更加注重用戶體驗(yàn),而前端異常卻如鯁在喉,甚是煩人。一、為什么要處理異常?異常是不可控的,會影響最終的呈現(xiàn)結(jié)果,但是我們有充分的理由去做這樣的事...
摘要:前端錯誤監(jiān)控一錯誤分類運(yùn)行時錯誤這個錯誤往往是在寫代碼是造成的。我知道錯誤了在實(shí)際的使用過程中,主要是來捕獲預(yù)料之外的錯誤,而則是用來在可預(yù)見情況下監(jiān)控特定的錯誤,兩者結(jié)合使用更加高效。 前端錯誤監(jiān)控 一、錯誤分類 1.運(yùn)行時錯誤:這個錯誤往往是在寫代碼是造成的。如語法錯誤、邏輯錯誤等,這種錯誤一般在測試過程也能夠發(fā)現(xiàn)。 2.資源加載錯誤:這個錯誤通常是找不到文件或者是文件加載超時造成...
閱讀 775·2023-04-25 16:55
閱讀 2804·2021-10-11 10:59
閱讀 2070·2021-09-09 11:38
閱讀 1782·2021-09-03 10:40
閱讀 1485·2019-08-30 15:52
閱讀 1125·2019-08-30 15:52
閱讀 954·2019-08-29 15:33
閱讀 3494·2019-08-29 11:26