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之ESC(第二类混淆)
May 06 Javascript
JQuery实现绚丽的横向下拉菜单
Dec 19 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
Oct 16 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
Nov 02 Javascript
Javascript的比较汇总
Jul 25 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
Nov 25 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
Feb 21 Javascript
Vue学习笔记进阶篇之过渡状态详解
Jul 14 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
Jun 08 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
JavaScript基于SVG的图片切换效果实例代码
Dec 15 Javascript
Vue——前端生成二维码的示例
Dec 19 Vue.js
基于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
关于PHP中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php中异常处理方法小结
2015/01/09 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
可实现多表单提交的javascript函数
2007/08/01 Javascript
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
2017/09/30 Javascript
傻瓜式解读koa中间件处理模块koa-compose的使用
2018/10/30 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
2020/01/09 Python
python如何求100以内的素数
2020/05/27 Python
Python中的With语句的使用及原理
2020/07/29 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
C语言50道问题
2014/10/23 面试题
护士长2015年终工作总结
2015/04/24 职场文书
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
《废话连篇——致新手》——chinapizza
2022/04/05 无线电
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers