/**异常错误 */ import { innertEvent } from './utils' class Error { constructor() { this.recordResourceError(); this.recordJavaScriptError(); } sendErrorStatic(typeName: string, sourceUrl: string) { innertEvent.trigger('errorStatic', { typeName: typeName, sourceUrl: sourceUrl }); } sendErrorJs(origin_errorMsg:any, origin_errorObj:any) { const errorMsg = origin_errorMsg ? origin_errorMsg : ''; const errorObj = origin_errorObj ? origin_errorObj : ''; let errorType = ""; if (errorMsg) { const errorStackStr = JSON.stringify(errorObj) errorType = errorStackStr.split(": ")[0].replace('"', ""); } innertEvent.trigger('errorJs', { errorMsg: errorType + ": " + errorMsg, errorObj: errorObj.replace(/↵/g,'\n') }); } /** * 页面资静态源加载错误监控 */ recordResourceError() { const root = this; window.addEventListener('error',function(e: Event){ const typeName = (e.target as any).localName; let sourceUrl = ""; if (typeName === "link") { sourceUrl = (e.target as any).href; } else if (typeName === "script") { sourceUrl = (e.target as any).src; } if (typeName) { root.sendErrorStatic(typeName, sourceUrl) } }, true); } /** * 页面JS错误监控 */ recordJavaScriptError() { const root = this; let jsMonitorStarted = false; // 重写console.error, 可以捕获更全面的报错信息 const oldError = console.error; console.error = function () { // arguments的长度为2时,才是error上报的时机 // if (arguments.length < 2) return; const errorMsg = arguments[0] && arguments[0].message; let errorObj = arguments[0] && arguments[0].stack; if (!errorObj) { errorObj = arguments[0]; } // 如果onerror重写成功,就无需在这里进行上报了 !jsMonitorStarted && root.sendErrorJs(errorMsg, errorObj); return oldError.apply(console, arguments); }; // 重写 onerror 进行jsError的监听 window.onerror = function(errorMsg, url, lineNumber, columnNumber, errorObj) { //jsMonitorStarted = true; const errorStack = errorObj ? errorObj.stack as any : ''; root.sendErrorJs(errorMsg, errorStack); }; } } export default Error