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 相关文章推荐
Firefox window.close()的使用注意事项
Apr 11 Javascript
javascript发送短信验证码实现代码
Nov 12 Javascript
Bootstrap每天必学之栅格系统(布局)
Nov 25 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
Mar 25 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
May 19 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
artDialog+plupload实现多文件上传
Jul 19 Javascript
AngularJs页面筛选标签小功能
Aug 01 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
Jan 17 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
Jun 28 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
Sep 18 Javascript
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 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
咖啡知识大全
2021/03/03 新手入门
谈谈PHP语法(5)
2006/10/09 PHP
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
Laravel框架数据库迁移操作实例详解
2020/04/06 PHP
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
Js四则运算函数代码
2012/07/21 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
Layui实现带查询条件的分页
2019/07/27 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
python类定义的讲解
2013/11/01 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
Matplotlib绘制雷达图和三维图的示例代码
2020/01/07 Python
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
Yahoo-PHP面试题1
2016/07/20 面试题
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
计算机应用与科学个人的自我评价
2013/11/15 职场文书
升职自荐书范文
2013/11/28 职场文书
2014年班组长工作总结
2014/11/20 职场文书
Python使用pyecharts控件绘制图表
2022/06/05 Python