javascript window.onerror事件

在捕获js错误时,我们通常使用try{}catch(e){}的方式,然后通过e.errorMessage等方式获取错误信息然后报告错误。但对于onerror事件可能很少问津,我们是否思考过如何报告错误所在的行号?如果想过这个是否也被这个问题所困扰过,是否认为在js里不可能捕获错误的行号呢?其实本人就遇到上述的几个问题,今日读某人写的一段js代码顿然发现了onerror事件,要说onerror这个时间也是n久以前就知道了,但对于其所带有的三个参数和其特殊性质却一直没有去了解过。经过自己的研究测试,对onerror事件有了一些新的认识和了解。在页面没有错误时,window.onerror事件是不存在的,也就是null(废话!没出错如果onerror出现还正常吗?)我们一般通过函数名传递的方式(引用的方式)将要执行的操作函数传递给onerror事件,如window.οnerrοr=reportError;window.οnerrοr=function(){alert('error')},但我们可能不知道该事件触发时还带有三个默认的参数,他们分别是错误信息,错误页面的url和错误行号。要知道这个可是事件,就如onclick和onmouseover等事件一样,但它是有参数。我们可以这样测试。 

<script type="text/javascript">   
    window.οnerrοr=testError;   
    function testError(){   
    arglen=arguments.length;   
    var errorMsg="参数个数:"+arglen+"个";   
    for(var i=0;i<arglen;i++){   
    errorMsg+="\n参数"+(i+1)+":"+arguments[i];   
}   
    alert(errorMsg);   
    window.οnerrοr=null;   
    return true;   

    }   
    function test(){   
         error   
    }   
    test()   
</script> 

首先将testError方法绑定给onerror事件,然后在test方法里触发一个错误,在IE中执行时我们发现如下提示: 
--------------------------- 
Microsoft Internet Explorer 
--------------------------- 
参数个数:3个 
参数1:'error' 未定义 
参数2:file://E:\yanwei\test\testError.html 
参数3:14 
--------------------------- 
确定 
--------------------------- 
可以发现,当出错时函数testError捕获到了三个参数。通过将函数绑定到onerror事件就可以在页面出错时捕获以上三个参数。 

在测试中还发现以下一些问题: 
1、通过在函数末尾加上return true,可以在函数出错时不会弹出系统的错误信息(IE)。 
2、如果页面出现多次错误,只捕获第一次错误并进行处理然后终止后面程序的执行。 
3、onerror事件并不能捕获所有的错误,只能捕获函数外或函数内错误(??这个是什么意思,可不是开玩笑呢),如 adasdf; 
function test(){ 
aaaa; 

可以捕获到adasdf未定义的错误 
function test(){ 
aaaa; 

可以捕获到aaaa未定义的错误,而对于functiona test(){}或function test()dd{} 的错误却不能捕获而会直接弹出系统错误信息。 
4、onerror在IE和FF等浏览器执行方式是一样的,而且都包含这三个参数。


====================================================

//禁用iejs脚本报错
window.οnerrοr=function(){
return true;
};

====================================================

提到window.onerror,大家应该都不陌生吧。
为了屏蔽JS错误,为了应付所谓的领导的突击检查系统进度,可以暂时另令你的页面清净一下。

出现兼容性问题 
看一个例子:

<script>
window.οnerrοr=function(){
  document.write("encountered JS  errors.");
}
as();
</script>

上面代码中执行了一个未定义的JS方法 as()。当执行时,找不到定义,会报JS错误。
这段代码,在IE和Firefox里都有效果,在页面上输出了: encountered JS errors. 
在Chrome和Safati中,都在控制台报了JS错误。
Chrome:Uncaught ReferenceError: as is not defined 
Safari:ReferenceError: Can't find variable: as 
也就是说,在Chrome和Safari中,window.onerror未起作用。

可见,IE 和 Firefox 提供了对 window.onerror 事件的支持,当页面内的 JavaScript 脚本出现错误时,window.onerror 被触发。

标准中的说法 
HTML4.01 
W3C HTML4.01 规范第 18.2.3 节介绍了 HTML 中的固有事件(Intrinsic events),其中并没有 onerror 事件。

HTML5   
在 HTML5 规范草案中描述了 window 对象的事件处理程序,其中有 onerror 事件存在,详细情况请参照草案说明:6.1.6.2 Event handlers on elements 。可见,各浏览器还没有统一此实现。

MSDN和MDC   
根据 MSDN 及 Mozilla Developer Center 中 的描述,当页面中的脚本出错的时候就会触发 window.onerror 事件,这个事件的监听器(event handler)拥有三个参数:msg(错误消息内容)、url(发生错误的页面的 URL)、line(发生错误的代码所在行行号)。   
而浏览器是否按照其默认方式显示错误消息,取决于 onerror 事件的返回值。若返回 false,则在浏览器控制台(若有)中显示错误消息。反之则不再显示错误消息。

可见,对window.error的支持差异来自标准自身的不一致性,啥时候HTML5正式发布了,啥时候这个问题也就解决了吧应该。

所以,还是放弃使用window.onerror吧,使用try-catch捕捉错误是比较标准的做法。

更多兼容性问题: 
【分享】浏览器兼容性问题目录


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值