摘要:捕獲分為兩個(gè)方面收集語法執(zhí)行錯(cuò)誤最初的是想直接獲取控制臺(tái)的錯(cuò)誤信息然而這并不大可行,并沒有這樣的功能。
這個(gè)不是很常用的功能, 但是想收集客戶端的錯(cuò)誤信息時(shí)卻很有必要了解下。 捕獲分為兩個(gè)方面:收集JS語法、執(zhí)行錯(cuò)誤
最初的是想直接獲取控制臺(tái)的錯(cuò)誤信息; 然而這并不大可行,JS并沒有這樣的功能。
轉(zhuǎn)換下思路
在錯(cuò)誤發(fā)生時(shí),將錯(cuò)誤進(jìn)行存儲(chǔ)。
原生JS實(shí)現(xiàn)方式:通過重載 window 對(duì)象下的 onerror 函數(shù), 可以截取到這些信息。
window.onerror = function(errorMessage, scriptURI, lineNumber,columnNumber,errorObj) { console.log("錯(cuò)誤信息:" , errorMessage); console.log("出錯(cuò)文件:" , scriptURI); console.log("出錯(cuò)行號(hào):" , lineNumber); console.log("出錯(cuò)列號(hào):" , columnNumber); console.log("錯(cuò)誤詳情:" , 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 解析后并不會(huì)將錯(cuò)誤移交給 window.onerror 函數(shù)
但是 angular 在解析時(shí)會(huì)將所有的語法、執(zhí)行錯(cuò)誤時(shí)將會(huì)觸發(fā) $ExceptionHandlerProvider 函數(shù):
function $ExceptionHandlerProvider() { this.$get = ["$log", function($log) { return function(exception, cause) { $log.error.apply($log, arguments); }; }]; }
$ExceptionHandlerProvider 函數(shù)將會(huì)調(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); }; }
最終這些錯(cuò)誤會(huì)流入原生console.error內(nèi), 所以在angular下捕獲這些錯(cuò)誤將變的異常簡(jiǎn)單。僅僅需要重置console.error方法,如下所示:
resetConsole() { window.console._error = window.console.error; window.console.error = info => { // 在這里執(zhí)行錯(cuò)誤存儲(chǔ)或發(fā)送 window.console._error(info); }; }
angular 在解析錯(cuò)誤時(shí), 會(huì)通過$log.error.apply $window.console.error方法. 所以在這里將 console.error 進(jìn)行重置后, 語法、執(zhí)行錯(cuò)誤也會(huì)一并收集到。
收集請(qǐng)求錯(cuò)誤各框架都會(huì)將 XMLHttpRequest 進(jìn)行封裝, 可以找到對(duì)應(yīng)的errror函數(shù)內(nèi)將錯(cuò)誤進(jìn)行捕獲。
原生實(shí)現(xiàn)收集請(qǐng)求錯(cuò)前, 需要先對(duì)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("收集到一條錯(cuò)誤");// 在這里收集錯(cuò)誤信息 } }; xhr.send(null); } // 因?yàn)?ccccccom這個(gè)路徑是不存在的, 所以會(huì)執(zhí)行收集區(qū)域的代碼。 ajax("GET", "http://www.lovejavascript.ccccccom", function(a){console.log(a)});
如果對(duì) XMLHttpRequest 封裝感興趣, 可以看下我寫的 jTool類庫中的 ajax 對(duì)象
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/109715.html
摘要:前言做好錯(cuò)誤監(jiān)控,將用戶使用時(shí)的錯(cuò)誤日志上報(bào),可以幫助我們更快的解決一些問題。一個(gè)變通方案是單獨(dú)處理,告知錯(cuò)誤詳情僅能通過瀏覽器控制臺(tái)查看,無法通過訪問。 前言 做好錯(cuò)誤監(jiān)控,將用戶使用時(shí)的錯(cuò)誤日志上報(bào),可以幫助我們更快的解決一些問題。目前開源的比較好的前端監(jiān)控有 https://docs.sentry.io/ 那前端監(jiān)控是怎么實(shí)現(xiàn)的呢?要想了解這個(gè),需要知道前端錯(cuò)誤大概分為哪些以及如...
摘要:錯(cuò)誤上報(bào)機(jī)制發(fā)送數(shù)據(jù)因?yàn)檎?qǐng)求本身也有可能會(huì)發(fā)生異常,而且有可能會(huì)引發(fā)跨域問題,一般情況下更推薦使用動(dòng)態(tài)創(chuàng)建標(biāo)簽的形式進(jìn)行上報(bào)。 js錯(cuò)誤捕獲 js錯(cuò)誤的實(shí)質(zhì),也是發(fā)出一個(gè)事件,處理他 error實(shí)例對(duì)象 對(duì)象屬性 message:錯(cuò)誤提示信息 name:錯(cuò)誤名稱(非標(biāo)準(zhǔn)屬性)宿主環(huán)境賦予 stack:錯(cuò)誤的堆棧(非標(biāo)準(zhǔn)屬性)宿主環(huán)境賦予 對(duì)象類型(7種) Synt...
摘要:二需要處理哪些異常對(duì)于前端來說,我們可做的異常捕獲還真不少。總結(jié)一下,大概如下語法錯(cuò)誤代碼異常請(qǐng)求異常靜態(tài)資源加載異常異常異常跨域崩潰和卡頓下面我會(huì)針對(duì)每種具體情況來說明如何處理這些異常。 前端一直是距離用戶最近的一層,隨著產(chǎn)品的日益完善,我們會(huì)更加注重用戶體驗(yàn),而前端異常卻如鯁在喉,甚是煩人。一、為什么要處理異常?異常是不可控的,會(huì)影響最終的呈現(xiàn)結(jié)果,但是我們有充分的理由去做這樣的事...
摘要:前端錯(cuò)誤監(jiān)控一錯(cuò)誤分類運(yùn)行時(shí)錯(cuò)誤這個(gè)錯(cuò)誤往往是在寫代碼是造成的。我知道錯(cuò)誤了在實(shí)際的使用過程中,主要是來捕獲預(yù)料之外的錯(cuò)誤,而則是用來在可預(yù)見情況下監(jiān)控特定的錯(cuò)誤,兩者結(jié)合使用更加高效。 前端錯(cuò)誤監(jiān)控 一、錯(cuò)誤分類 1.運(yùn)行時(shí)錯(cuò)誤:這個(gè)錯(cuò)誤往往是在寫代碼是造成的。如語法錯(cuò)誤、邏輯錯(cuò)誤等,這種錯(cuò)誤一般在測(cè)試過程也能夠發(fā)現(xiàn)。 2.資源加載錯(cuò)誤:這個(gè)錯(cuò)誤通常是找不到文件或者是文件加載超時(shí)造成...
閱讀 781·2023-04-25 16:55
閱讀 2818·2021-10-11 10:59
閱讀 2081·2021-09-09 11:38
閱讀 1795·2021-09-03 10:40
閱讀 1493·2019-08-30 15:52
閱讀 1133·2019-08-30 15:52
閱讀 964·2019-08-29 15:33
閱讀 3505·2019-08-29 11:26