用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 相关文章推荐
HTML中事件触发列表与解说
Jul 09 Javascript
jquery调用asp.net 页面后台的实现代码
Apr 27 Javascript
Jquery进度条插件 Progress Bar小问题解决
Jul 12 Javascript
node.js回调函数之阻塞调用与非阻塞调用
Nov 13 Javascript
jQuery中$.ajax()方法参数解析
Oct 22 Javascript
微信小程序 参数传递详解
Oct 24 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
Oct 25 Javascript
JavaScript表单即时验证 验证不成功不能提交
Aug 31 Javascript
JS实现的合并多个数组去重算法示例
Apr 11 Javascript
CSS3 动画卡顿性能优化的完美解决方案
Sep 20 Javascript
Vuex 单状态库与多模块状态库详解
Dec 11 Javascript
微信小程序封装分享与分销功能过程解析
Aug 13 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正则表达匹配中文问题分析小结
2012/03/25 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
python实现文本文件合并
2015/12/29 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
wxPython实现画图板
2020/08/27 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
上海奥佳笔试题面试题
2016/11/16 面试题
计算机专业毕业生求职信
2014/04/30 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
七年级地理教学计划
2015/01/22 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle