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 设置元素相对于另一个元素的top值(实例代码)
Nov 06 Javascript
Extjs实现下拉菜单效果
Apr 01 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
May 17 Javascript
BootStrap selectpicker
Jun 20 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
Oct 10 Javascript
Vue异步组件使用详解
Apr 08 Javascript
jQuery开源组件BootstrapValidator使用详解
Jun 29 jQuery
ES6中Array.includes()函数的用法
Sep 20 Javascript
Vue项目分环境打包的实现步骤
Apr 02 Javascript
解析Json字符串的三种方法日常常用
May 02 Javascript
vue.js单文件组件中非父子组件的传值实例
Sep 13 Javascript
layui 解决form表单点击无反应的问题
Oct 25 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
繁简字转换功能
2006/07/19 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
python中反射用法实例
2015/03/27 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
Python实现简单的代理服务器
2015/07/25 Python
python数据封装json格式数据
2018/03/04 Python
实践Vim配置python开发环境
2018/07/02 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
自荐信如何“自荐”
2013/10/24 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
化学专业自荐信
2014/05/28 职场文书
环保标语口号
2014/06/13 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
python 爬取华为应用市场评论
2021/05/29 Python
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL