视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Javascript中获取出错代码所在文件及行数的代码_javascript技巧
2020-11-27 20:55:03 责编:小采
文档


原先使用的是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();


这里之所以没用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对象已经提供了足够的信息给我们调试使用了。下面要做的就是把这两种方式结合起来,使之在不同浏览器下都能很好的汇报这些错误。

下面这段代码封装了在不同浏览器之上汇报异常的功能:

代码如下:

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);
}
}

下载本文
显示全文
专题