Javascript中获取出错代码所在文件及行数的代码


Posted in Javascript onSeptember 23, 2010

原先使用的是try-catch的方式,在catch语句中,我们会收到一个Error对象(我们也可以抛出一个自定义异常对象)。Firefox中的Error对象拥有如下属性:

message —— 错误提示信息
fileName —— 表示出错代码所在文件
lineNumber —— 出错代码所在行数
stack —— 出错堆栈信息
name —— 异常对象名/类型
但是在IE下,Error对象只有如下属性:

name —— 异常对象名/类型,和Firefox中显示的名称可能不同
message —— 错误提示信息
description —— 和message属性相同
number —— ErrorCode,错误代码,对于普通开发人员来说基本没意义
也就是说在IE下我们无法获得最希望得到的错误代码所在文件名及出错行数的信息。后来在学校论坛求教之后知道了window(全局对象)下有一个onerror的对象。这个对象或者说window的属性绑定的是一个错误处理函数。脚本中任何未被捕获的错误最终都会扩散到window这一层,然后被onerror绑定的处理函数所处理。查了一下相关文档,发现绑定的错误处理函数会接受到三个参数:

view sourceprint?function onError(message,url,line){}

非常欣慰的是,这个机制兼容IE和Firefox。

下面举一个例子:

function doSomething(){ 
var lastErrorHandler = window.onerror; 
window.onerror = function(message,url,line){ 
// 汇报错误 
alert("执行" + url + "文件中的第" + line + "行代码出错,错误信息:" + message); 
window.onerror = lastErrorHandler; 
// 不希望此错误继续扩散 
return true; 
}; 
// 不小心出错了... 
sldfjlskdjflj; window.onerror = lastErrorHandler; 
} 
doSomething();

Javascript中获取出错代码所在文件及行数的代码
这里之所以没用attachEvent的方式,是因为detach比较不方便。如果希望此错误处理变成全局的,那么可以使用attachEvent(Firefox下是addEventListener)的方式。

需要注意,Safari(Chrome使用的也是一样的内核)和Opera都不支持此机制,这两个核心的浏览器都不支持全局的error事件,因此没法使用这种方式来捕获异常信息,只能使用try-catch的方式。

试验了一下,在Safari中的Error对象拥有如下属性:

message —— 错误提示信息
line —— 出错代码所在行数
sourceId —— 一个数字,不明白什么意思
sourceURL —— 表示出错代码所在文件
name —— 异常对象名/类型
Opera下的Error对象拥有如下属性:

message —— 错误提示信息
opera#sourceloc —— 出错代码所在行数
stacktrace —— 出错堆栈信息
这两个浏览器中的Error对象已经提供了足够的信息给我们调试使用了。下面要做的就是把这两种方式结合起来,使之在不同浏览器下都能很好的汇报这些错误。

下面这段代码封装了在不同浏览器之上汇报异常的功能:

<script type=”text/javascript”> 
function reportError(err){ 
var errMsg = []; 
for(var p in err){ 
if(err.hasOwnProperty(p)){ 
errMsg.push(p + "=" + err[p]); 
} 
} 
alert(errMsg.join("\n")); 
} 
function doSomething(){ 
var lastErrorHandler = window.onerror; 
window.onerror = function(message, url, line){ 
// 汇报错误 
reportError({ 
message: message, 
url: url, 
line: line 
}); 
window.onerror = lastErrorHandler; 
// 不希望此错误继续扩散 
return true; 
} // 不小心出错了... 
sldfjlskdjflj; 
window.onerror = lastErrorHandler; 
} 
try{ 
// 执行可能出错的代码 
doSomething(); 
}catch(e){ 
if("\v"=="v"){ 
// 对于IE直接让此错误扩散到最外层 
throw e; 
}else{ 
// 对于其他任意浏览器直接汇报此异常对象 
reportError(e); 
} 
} 
</script>
Javascript 相关文章推荐
Javascript的getYear、getFullYear、getUTCFullYear异同分享
Nov 30 Javascript
一个php+js实时显示时间问题
Oct 12 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
Oct 10 Javascript
pc加载更多功能和移动端下拉刷新加载数据
Nov 07 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
Feb 05 Javascript
在小程序中使用canvas的方法示例
Sep 17 Javascript
微信小程序与后台PHP交互的方法实例分析
Dec 10 Javascript
vue中使用v-model完成组件间的通信
Aug 22 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
Aug 05 Javascript
在Vue 中获取下拉框的文本及选项值操作
Aug 13 Javascript
解决vant中 tab栏遇到的坑 van-tabs
Nov 04 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
Sep 23 #Javascript
用js模拟JQuery的show与hide动画函数代码
Sep 20 #Javascript
通过DOM脚本去设置样式信息
Sep 19 #Javascript
javscript对象原型的一些看法
Sep 19 #Javascript
Ext 今日学习总结
Sep 19 #Javascript
JS面向对象编程 for Cookie
Sep 19 #Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
Sep 19 #Javascript
You might like
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
php7下的filesize函数
2019/09/30 PHP
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
[49:07]VGJ.T vs Optic Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
python插入数据到列表的方法
2015/04/30 Python
Python正则表达式教程之二:捕获篇
2017/03/02 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
Python给图像添加噪声具体操作
2019/03/03 Python
详解Python对JSON中的特殊类型进行Encoder
2019/07/15 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
办理护照介绍信
2014/01/16 职场文书
房屋认购协议书
2015/01/29 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
大学文艺委员竞选稿
2015/11/19 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书