加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

一篇文章教你如何捕获前端错误

发布时间:2019-07-16 08:50:53 所属栏目:评测 来源:黄文佳
导读:副标题#e# 随着前端页面承载功能越来越多,用户本地浏览器环境也错综复杂,因此即使有完善的测试,我们也无法保证上线的代码不会出错。在这种场景下,前端页面的监控就成了各个web项目必备的工具。 一般对页面的监控包含页面性能、页面错误以及用户行为路径

因此我们需要额外的改写xhr的open方法,将传入的url记录下来,方便上报时带上。

  1. var _oldOpen = xmlhttp.prototype.open; 
  2. // 重写open方法,记录请求的url 
  3. xmlhttp.prototype.open = function (method, url) { 
  4.     _oldOpen.apply(this, arguments); 
  5.     this.ajaxUrl = url; 
  6. }; 

其他问题

1、其他框架,例如vue项目的错误捕获

vue内部发生的错误会被Vue拦截,因此vue提供方法给我们处理vue组件内部发生的错误。

  1. Vue.config.errorHandler = function (err, vm, info) {  // handle error  // `info` 是 Vue 特定的错误信息,比如错误所在的生命周期钩子  // 只在 2.2.0+ 可用} 

2、script error的解决方式

"script error.”有时也被称为跨域错误。当网站请求并执行一个托管在第三方域名下的脚本时,就可能遇到该错误。最常见的情形是使用 CDN 托管 JS 资源。

其实这并不是一个 JavaScript Bug。出于安全考虑,浏览器会刻意隐藏其他域的 JS 文件抛出的具体错误信息,这样做可以有效避免敏感信息无意中被不受控制的第三方脚本捕获。

因此,浏览器只允许同域下的脚本捕获具体错误信息,而其他脚本只知道发生了一个错误,但无法获知错误的具体内容。

解决方案1:(推荐)

添加 crossorigin="anonymous" 属性。

  1. <script src="http://another-domain.com/app.js" crossorigin="anonymous"></script> 

此步骤的作用是告知浏览器以匿名方式获取目标脚本。这意味着请求脚本时不会向服务端发送潜在的用户身份信息(例如 Cookies、HTTP 证书等)。

添加跨域 HTTP 响应头:

  1. Access-Control-Allow-Origin: * 

或者

  1. Access-Control-Allow-Origin: http://test.com 

注意:大部分主流 CDN 默认添加了 Access-Control-Allow-Origin 属性。

完成上述两步之后,即可通过 window.onerror 捕获跨域脚本的报错信息。

解决方案2

难以在 HTTP 请求响应头中添加跨域属性时,还可以考虑 try catch 这个备选方案。

在如下示例 HTML 页面中加入 try catch:

  1. <!doctype html> 
  2. <html> 
  3. <head> 
  4.     <title>Test page in http://test.com</title> 
  5. </head> 
  6. <body> 
  7.     <script src="http://another-domain.com/app.js"></script> 
  8.     // app.js里面有一个foo方法,调用了不存在的bar方法 
  9.     <script> 
  10.     window.onerror = function (message, url, line, column, error) { 
  11.         console.log(message, url, line, column, error); 
  12.     } 
  13.     try { 
  14.         foo(); 
  15.     } catch (e) { 
  16.         console.log(e); 
  17.  
  18.         throw e; 
  19.     } 
  20. </script> 
  21. </body> 
  22. </html> 
  23.  
  24. // 运行输出结果如下: 
  25.  
  26. => ReferenceError: bar is not defined 
  27. at foo (http://another-domain.com/app.js:2:3) 
  28. at http://test.com/:15:3 
  29. => "Script error.", "", 0, 0, undefined 

可见 try catch 中的 Console 语句输出了完整的信息,但 window.onerror 中只能捕获“Script error”。根据这个特点,可以在 catch 语句中手动上报捕获的异常。

总结

上述的错误捕获基本覆盖了前端监控所需的错误场景,但是第三部分指出的两个其他问题,目前解决的方式都不太完美。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读