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在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 Javascript
深入领悟JavaScript中的面向对象
Nov 18 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
Nov 28 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
Sep 01 Javascript
更靠谱的H5横竖屏检测方法(js代码)
Sep 13 Javascript
vue省市区三联动下拉选择组件的实现
Apr 28 Javascript
form表单序列化详解(推荐)
Aug 15 Javascript
css和js实现弹出登录居中界面完整代码
Nov 26 Javascript
详解JS模块导入导出
Dec 20 Javascript
React Navigation 使用中遇到的问题小结
May 08 Javascript
解决layui页面按钮点击无反应,也不报错的问题
Sep 29 Javascript
React Native项目框架搭建的一些心得体会
May 28 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
深入分析PHP优化及注意事项
2016/07/04 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
echarts浮动显示单位的实现方法示例
2020/12/04 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
Python实现批量下载文件
2015/05/17 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
python获取Linux发行版名称
2019/08/30 Python
python字符串下标与切片及使用方法
2020/02/13 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
入党申请书自我鉴定
2013/10/12 职场文书
签约仪式主持词
2014/03/19 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
电影雷锋观后感
2015/06/10 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android
redis cluster支持pipeline的实现思路
2021/06/23 Redis