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 相关文章推荐
锋利的jQuery 第三章章节总结的例子
Mar 23 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
Jun 03 Javascript
与Math.pow 相反的函数使用介绍
Aug 04 Javascript
jQuery中last()方法用法实例
Jan 06 Javascript
javacript使用break内层跳出外层循环分析
Jan 12 Javascript
JavaScript实现Java中StringBuffer的方法
Feb 09 Javascript
元素绑定click点击事件方法
Jun 08 Javascript
关于JavaScript中事件绑定的方法总结
Oct 26 Javascript
微信小程序实战之自定义toast(6)
Apr 18 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
Sep 24 Javascript
基于jQuery实现挂号平台首页源码
Jan 06 jQuery
three.js欧拉角和四元数的使用方法
Jul 26 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
Python闭包思想与用法浅析
2018/12/27 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
Python request post上传文件常见要点
2020/11/20 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
为什么需要版本控制?
2013/08/08 面试题
制衣厂各岗位职责
2013/12/02 职场文书
《雷雨》教学反思
2014/02/20 职场文书
项目建议书范文
2014/05/12 职场文书
学期个人自我总结
2015/02/13 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
Python入门学习之类的相关知识总结
2021/05/25 Python
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android