用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 相关文章推荐
用js实现随机返回数组的一个元素
Aug 13 Javascript
将string解析为json的几种方式小结
Nov 11 Javascript
JQuery实现展开关闭层的方法
Feb 17 Javascript
AngularJS实现一次监听多个值发生的变化
Aug 31 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
Oct 21 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
Jan 08 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
Nov 24 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
Apr 27 Javascript
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 jQuery
vue兄弟组件传递数据的实例
Sep 06 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
Sep 17 Javascript
详解vue 组件注册
Nov 20 Vue.js
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实现webservice实例
2014/11/06 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
php实现文件预览功能
2017/05/23 PHP
php通过各种函数判断0和空
2020/07/04 PHP
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
python相似模块用例
2016/03/04 Python
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
基于Python fminunc 的替代方法
2020/02/29 Python
python中pow函数用法及功能说明
2020/12/04 Python
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
上班早退检讨书
2014/01/09 职场文书
运动会广播稿50字
2014/01/26 职场文书
红领巾广播站广播稿
2014/02/01 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
节约能源标语
2014/06/17 职场文书
励志演讲稿200字
2014/08/21 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
2014年就业工作总结
2014/11/26 职场文书
《灰雀》教学反思
2016/02/19 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS