Javascript中获取出错代码所在文件及行数 "转载"
2010-09-21 15:38
633 查看
之前在做一个Javascript的日志控制台功能模块,希望能够在Javascript代码出错时捕获此错误,并将出错的文件及相应的行数打印到控制台并汇报给服务器。原先使用的是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绑定的处理函数所处理。查了一下相关文档,发现绑定的错误处理函数会接受到三个参数:
非常欣慰的是,这个机制兼容IE和Firefox。
下面举一个例子:
这里之所以没用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对象已经提供了足够的信息给我们调试使用了。下面要做的就是把这两种方式结合起来,使之在不同浏览器下都能很好的汇报这些错误。
下面这段代码封装了在不同浏览器之上汇报异常的功能:
注:文章转载于:http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html
message —— 错误提示信息
fileName —— 表示出错代码所在文件
lineNumber —— 出错代码所在行数
stack —— 出错堆栈信息
name —— 异常对象名/类型
但是在IE下,Error对象只有如下属性:
name —— 异常对象名/类型,和Firefox中显示的名称可能不同
message —— 错误提示信息
description —— 和message属性相同
number —— ErrorCode,错误代码,对于普通开发人员来说基本没意义
也就是说在IE下我们无法获得最希望得到的错误代码所在文件名及出错行数的信息。后来在学校论坛求教之后知道了window(全局对象)下有一个onerror的对象。这个对象或者说window的属性绑定的是一个错误处理函数。脚本中任何未被捕获的错误最终都会扩散到window这一层,然后被onerror绑定的处理函数所处理。查了一下相关文档,发现绑定的错误处理函数会接受到三个参数:
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();
这里之所以没用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>
注:文章转载于:http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html
相关文章推荐
- Javascript中获取出错代码所在文件及行数的代码
- Javascript中获取出错代码所在文件及行数的代码
- C# 获取当前文件名、执行函数、执行代码行数和列数
- 问题-[Delphi]通过Map文件查找内存地址出错代码所在行
- C# 获取当前文件名、执行函数、执行代码行数和列数
- C++ 输出代码所在的文件、行数以及函数名称
- C# 如何获取出错的错误所在行数信息[原创]_C#教程_脚本之家
- c#代码获取web.config配置文件里面设置的 <compilation debug="true"节点的debug值
- JavaScript调用ajax获取文本文件内容实现代码
- 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
- JavaScript获取当前运行脚本文件所在目录的方法
- 获取日期时间星期的"JAVASCRIPT代码"
- python 脚本(获取指定文件夹、指定文件格式、的代码行数、注释行数)
- JAVASCRIPT:漂浮的广告,status设置,getElementById("id")获取文件名称
- Unity3D开发之“获取IOS设备所在的国家代码"
- python 脚本(获取指定文件夹、指定文件格式、的代码行数、注释行数)
- VirtualBox的Ubuntu中文件共享问题的解决:未处理的错误消息,获取文件"/media/sf_***"信息出错,协议错误
- C++ 输出代码所在的文件、行数以及函数名称
- JavaScript获取当前运行脚本文件所在目录的方法