用window.onerror捕获并上报Js错误的方法


Posted in Javascript onJanuary 27, 2016

前两天有个2048游戏的用户反馈说,打开游戏后不能玩儿,只有一个游戏面板,数字无法初始化,更无法移动,设备为iPhone 4S、iOS 5.1。尝试从微信调起Safari打开,依然不好使。由于游戏中运用了比较多的HTML5特性,所以粗略估计是有JS报错导致。不过这样的信息该如何捕获到呢?当然是传说中的window.onerror。

从W3C找到关于window.onerror的方法体介绍:

用window.onerror捕获并上报Js错误的方法

这个意思,基本可以就是说,window.onerror方法,我们可以写成:

/** 
 * @param {String} errorMessage  错误信息 
 * @param {String} scriptURI   出错的文件 
 * @param {Long}  lineNumber   出错代码的行号 
 * @param {Long}  columnNumber  出错代码的列号 
 * @param {Object} errorObj    错误的详细信息,Anything 
 */
window.onerror = function(errorMessage, scriptURI, lineNumber,columnNumber,errorObj) { 
  // TODO 
}

不过使用过程中还得注意兼容性问题,不是所有浏览器都有参数列表中的所有参数,chrome之类的,都是浏览器标准草案的领跑者,这些个参数用就是了!

于是,可以写一个小Demo来尝试一下:

<!DOCTYPE html> 
<html> 
<head> 
  <title>Js错误捕获</title> 
  <script type="text/javascript"> 
  /** 
   * @param {String} errorMessage  错误信息 
   * @param {String} scriptURI   出错的文件 
   * @param {Long}  lineNumber   出错代码的行号 
   * @param {Long}  columnNumber  出错代码的列号 
   * @param {Object} errorObj    错误的详细信息,Anything 
   */ 
  window.onerror = function(errorMessage, scriptURI, lineNumber,columnNumber,errorObj) { 
    console.log("错误信息:" , errorMessage); 
    console.log("出错文件:" , scriptURI); 
    console.log("出错行号:" , lineNumber); 
    console.log("出错列号:" , columnNumber); 
    console.log("错误详情:" , errorObj); 
  } 
  </script> 
</head> 
<body> 
  <script type="text/javascript" src="error.js"></script> 
</body> 
</html>

其中error.js文件中的内容,简单的这样写一句:

throw new Error("出错了!");
用浏览器跑起来以后,打开console,基本就是这样的了:

用window.onerror捕获并上报Js错误的方法

所以,这些数据都是可以做上报的了。
当然了,上面的error.js是和html页面同域名下,如果error.js不在同域下,会是怎样的?我们把error.js的引用改一下:

<script type="text/javascript" src="//doitbegin.duapp.com/error.js"></script>
再来打开console,我们看到的是这样的:

用window.onerror捕获并上报Js错误的方法

相当于window.onerror方法只捕获到了一个errorMessage,而且是固定字符串,毫无参考价值。查了点资料(Webkit源码),发现在浏览器实现script资源加载的地方,是进行了同源策略判断的,如果是非同源资源,errorMessage就被写死为“Script error”了:

用window.onerror捕获并上报Js错误的方法

好在script标签有一个crossorigin属性,设置它可以显示比较详细的错误信息,我们试着将script标签改一下:

<script type="text/javascript" src="//doitbegin.duapp.com/error.js" crossorigin></script>
刷新页面,这个时候看到console中的输出是这样的:

用window.onerror捕获并上报Js错误的方法

出现这个error也不意外,既然设置了error.js为crossorigin,那error.js的HTTP Response Header也必须设置非同源可访问。为了方便设置Header,把error.js做一个小改动,更名为:error-js.php。

<?php 
  header('Access-Control-Allow-Origin:*'); 
  header('Content-type:text/javascript'); 
?> 
throw new Error('出错了');

此时刷新页面,看到console中的输出就已经正常了,所有信息都能正常捕获:

用window.onerror捕获并上报Js错误的方法

OK,技术细节分析结束!我2048游戏静态资源是放到静态域(非同源)下的,所以要想通过window.onerror捕获错误信息,就得按照上面的最后一种情况来操作了:

1、添加script的crossorigin属性

2、配置一下服务器,设置静态资源Javascript的Response为Access-Control-Allow-Origin

Javascript 相关文章推荐
Javascript客户端将指定区域导出到Word、Excel的代码
Oct 22 Javascript
javascript中interval与setTimeOut的区别示例介绍
Mar 14 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
May 15 Javascript
jquery实现弹出层登录和全屏层注册特效
Aug 28 Javascript
微信小程序 rpx 尺寸单位详细介绍
Oct 13 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
Jan 27 Javascript
Node.js npm命令运行node.js脚本的方法
Oct 10 Javascript
详解vue微信网页授权最终解决方案
Jun 16 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
Aug 28 Javascript
layui 解决富文本框form表单提交为空的问题
Oct 26 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
Mar 05 Javascript
JS模拟实现京东快递单号查询
Nov 30 Javascript
jquery实现可旋转可拖拽的文字效果代码
Jan 27 #Javascript
jquery+css3实现会动的小圆圈效果
Jan 27 #Javascript
再谈JavaScript异步编程
Jan 27 #Javascript
简单介绍jsonp 使用小结
Jan 27 #Javascript
理解javascript异步编程
Jan 27 #Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
Jan 27 #Javascript
AngularJS转换响应内容
Jan 27 #Javascript
You might like
PHP的开合式多级菜单程序
2006/10/09 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
Python open读写文件实现脚本
2008/09/06 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
在Python中使用成员运算符的示例
2015/05/13 Python
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
python实现linux下使用xcopy的方法
2015/06/28 Python
Python中的变量和作用域详解
2016/07/13 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python学生信息管理系统(初级版)
2018/10/17 Python
Python循环实现n的全排列功能
2019/09/16 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
益模软件Java笔试题
2012/03/27 面试题
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
《雪儿》教学反思
2014/04/17 职场文书
机关搬迁方案
2014/05/18 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
护士先进个人总结
2015/02/13 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
吃通javascript正则表达式
2021/04/21 Javascript