资讯专栏INFORMATION COLUMN

js捕获错误信息

yuanzhanghu / 851人阅读

摘要:捕获分为两个方面收集语法执行错误最初的是想直接获取控制台的错误信息然而这并不大可行,并没有这样的功能。

这个不是很常用的功能, 但是想收集客户端的错误信息时却很有必要了解下。 捕获分为两个方面:
收集JS语法、执行错误

最初的是想直接获取控制台的错误信息; 然而这并不大可行,JS并没有这样的功能。

转换下思路

在错误发生时,将错误进行存储。

原生JS实现方式:

通过重载 window 对象下的 onerror 函数, 可以截取到这些信息。

window.onerror = function(errorMessage, scriptURI, lineNumber,columnNumber,errorObj) {
   console.log("错误信息:" , errorMessage);
   console.log("出错文件:" , scriptURI);
   console.log("出错行号:" , lineNumber);
   console.log("出错列号:" , columnNumber);
   console.log("错误详情:" , errorObj);
}
框架实现方式:
只在angular 下做了实现,没有实现过的框架没有发言权;接下来将以angular为例。但要注意的是在部分框下这种方式是不生效的,原因是在框架解析代码前,所有的代码可以理解为都是文本而非js文件。

angular 环境下无法使用window.ondrror. 原因是angular体制内的代码通过$even 解析后并不会将错误移交给 window.onerror 函数

但是 angular 在解析时会将所有的语法、执行错误时将会触发 $ExceptionHandlerProvider 函数:

function $ExceptionHandlerProvider() {
  this.$get = ["$log", function($log) {
    return function(exception, cause) {
      $log.error.apply($log, arguments);
    };
  }];
}

$ExceptionHandlerProvider 函数将会调用 consoleLog("error") 函数

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内, 所以在angular下捕获这些错误将变的异常简单。仅仅需要重置console.error方法,如下所示:

resetConsole() {
    window.console._error = window.console.error;
    window.console.error = info => {
        // 在这里执行错误存储或发送
        window.console._error(info);
    };
}

angular 在解析错误时, 会通过$log.error.apply $window.console.error方法. 所以在这里将 console.error 进行重置后, 语法、执行错误也会一并收集到。

收集请求错误

各框架都会将 XMLHttpRequest 进行封装, 可以找到对应的errror函数内将错误进行捕获。

原生实现收集请求错前, 需要先对XMLHttpRequest进行封装,示例如下:

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);
}
// 因为.ccccccom这个路径是不存在的, 所以会执行收集区域的代码。
ajax("GET", "http://www.lovejavascript.ccccccom", function(a){console.log(a)});

如果对 XMLHttpRequest 封装感兴趣, 可以看下我写的 jTool类库中的 ajax 对象

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109715.html

相关文章

  • JS错误监控总结

    摘要:前言做好错误监控,将用户使用时的错误日志上报,可以帮助我们更快的解决一些问题。一个变通方案是单独处理,告知错误详情仅能通过浏览器控制台查看,无法通过访问。 前言 做好错误监控,将用户使用时的错误日志上报,可以帮助我们更快的解决一些问题。目前开源的比较好的前端监控有 https://docs.sentry.io/ 那前端监控是怎么实现的呢?要想了解这个,需要知道前端错误大概分为哪些以及如...

    wqj97 评论0 收藏0
  • 详解JS错误处理:前端JS/Vue/React/Iframe/跨域/Node

    摘要:错误上报机制发送数据因为请求本身也有可能会发生异常,而且有可能会引发跨域问题,一般情况下更推荐使用动态创建标签的形式进行上报。 js错误捕获 js错误的实质,也是发出一个事件,处理他 error实例对象 对象属性 message:错误提示信息 name:错误名称(非标准属性)宿主环境赋予 stack:错误的堆栈(非标准属性)宿主环境赋予 对象类型(7种) Synt...

    张利勇 评论0 收藏0
  • 如何优雅处理前端的异常?

    摘要:二需要处理哪些异常对于前端来说,我们可做的异常捕获还真不少。总结一下,大概如下语法错误代码异常请求异常静态资源加载异常异常异常跨域崩溃和卡顿下面我会针对每种具体情况来说明如何处理这些异常。 前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人。一、为什么要处理异常?异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的事...

    zoomdong 评论0 收藏0
  • 前端错误监控

    摘要:前端错误监控一错误分类运行时错误这个错误往往是在写代码是造成的。我知道错误了在实际的使用过程中,主要是来捕获预料之外的错误,而则是用来在可预见情况下监控特定的错误,两者结合使用更加高效。 前端错误监控 一、错误分类 1.运行时错误:这个错误往往是在写代码是造成的。如语法错误、逻辑错误等,这种错误一般在测试过程也能够发现。 2.资源加载错误:这个错误通常是找不到文件或者是文件加载超时造成...

    inapt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<