用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 相关文章推荐
jquery实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 Javascript
关于include标签导致js路径找不到的问题分析及解决
Jul 09 Javascript
JavaScript数组Array对象增加和删除元素方法总结
Jan 20 Javascript
js实现具有高亮显示效果的多级菜单代码
Sep 01 Javascript
js动态生成form 并用ajax方式提交的实现方法
Sep 09 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
Feb 10 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
Nov 18 Javascript
js装饰设计模式学习心得
Feb 17 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
Aug 10 Javascript
基于JavaScript canvas绘制贝塞尔曲线
Dec 25 Javascript
node中实现删除目录的几种方法
Jun 24 Javascript
js实现多张图片每隔一秒切换一张图片
Jul 29 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编码转换
2012/11/05 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
jQuery中使用each处理json数据
2015/04/23 Javascript
jquery自定义表格样式
2015/11/23 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
Python浅复制中对象生存周期实例分析
2018/04/02 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
物流专业大学生求职信范文
2013/10/28 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书