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 相关文章推荐
EXT中xtype的含义分析
Jan 07 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
Nov 14 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
Mar 25 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
Oct 17 Javascript
javascript实现的猜数小游戏完整实例代码
May 10 Javascript
jquery属性,遍历,HTML操作方法详解
Sep 17 Javascript
使用Javascript监控前端相关数据的代码
Oct 27 Javascript
jQuery简单实现MD5加密的方法
Mar 03 Javascript
javascript性能优化之分时函数的介绍
Mar 28 Javascript
js实现前面自动补全位数的方法
Oct 10 Javascript
Vue中qs插件的使用详解
Feb 07 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
Jun 12 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
MYSQL数据库初学者使用指南
2006/11/16 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
php异常处理捕获错误整理
2019/09/23 PHP
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
详解AngularJS之$window窗口对象
2018/01/17 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
HTML中使用python屏蔽一些基本功能的方法
2017/07/07 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
python调用其他文件函数或类的示例
2019/07/16 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
Python函数参数分类原理详解
2020/05/28 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
致跳高运动员加油稿
2014/02/12 职场文书
工作鉴定评语
2014/05/04 职场文书
绿色环保标语
2014/06/12 职场文书
房地产项目合作意向书
2015/05/08 职场文书
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers