首页 > 开发 > JS > 正文

window.onerror()的用法与实例分析

2024-05-06 16:27:56
字体:
来源:转载
供稿:网友
目前在做window.onerror时上报js错误信息的事,整理下相关资料,需要的朋友可以参考下
 

onerror语法使用

onerror 默认有三个入参:

•msg: 错误信息
•url:错误所在文件
•line: 错误所在代码行,整型
window.onerror = function(msg, url, line){ // some code }; 
对于 <body onerror=”some code”>形式的,可以通过arguments[0]、arguments[1]、arguments[2]依次获取参数。

js中我们最常用的就是js容错

window.onerror=function(){return true;}

 

基本特性
可以通过设置returnValue=true,或直接return true来阻止浏览器显示错误信息。但不会阻止script debuggers弹出的调试框。
只有运行错误才会触发onerror,语法错误不会触发。

以下三种方式可以引发onerror:

•运行时错误,例如无效的对象引用或安全限制
•下载错误,如图片
•在IE9中,获取多媒体数据失败也会引发
<script> 标签不支持onerror。

定义在 <body> 标签上的onerror属性相当于window.onerror (经测试,Firefox、Opera支持,IE9、chrome无反应)。

浏览器兼容性

QuirksMode列出的各浏览器对onError的支持情况

•Chrome 13+
•Firefox 6.1+
•Internet Explorer 5.5+
•Safari 5.1+
•Opera 11.61+ (QuirksMode 测试到11.51尚不支持,我手头上的11.61已支持)
除window对象外,支持 onerror 的元素:

•<img> 全支持
•<script> IE9/IE10/safari 5.1+/chrome 13+ 支持
<css> 和 <iframe> 不支持onerror。

问题与解决方案

对于引用外部js文件中的错误, 复制代码代码如下:


“Script error.”,”", 0

 

例如http://a.com/index.html,引入了http://b.com/g.js,如果g.js出错,最终传递到window.onerror的信息会被篡改。

浏览器之所以做这样的处理,是考虑到两个特性:

•<script> 能执行非同源下的第三方js文件。
•<script> 元素会忽略加载的文件的MIME类型,而当作脚本来执行。
在攻击场景中,恶意页面引入了正常页面的js文件,js文件会自动执行,若发生异常触发的报错信息,可能会泄漏某些敏感数据。这些信息最终会被恶意页面的window.onerror处理。

经测试,存在此特性的浏览器(当前最新版)有Firefox、Chrome、Safari、Opera。

<SCRIPT>window.onerror=fnErrorTrap;function fnErrorTrap(sMsg,sUrl,sLine){oErrorLog.innerHTML="<b>An error was thrown and caught.</b><p>";oErrorLog.innerHTML+="Error: " + sMsg + "<br>";oErrorLog.innerHTML+="Line: " + sLine + "<br>";oErrorLog.innerHTML+="URL: " + sUrl + "<br>";return false;}function fnThrow(){eval(oErrorCode.value);}</SCRIPT><INPUT TYPE="text" ID=oErrorCode VALUE="someObject.someProperty=true;"><INPUT TYPE="button" VALUE="Throw Error" onclick="fnThrow()"><P><DIV ID="oErrorLog"></DIV>

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

<script type="text/javascript">    window.onerror=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.onerror=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等浏览器执行方式是一样的,而且都包含这三个参数。



注:相关教程知识阅读请移步到
JavaScript/Ajax教程频道。
上一篇:再谈JavaScript异步编程

下一篇:javascript鼠标右键菜单自定义效果

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
学习交流
热门图片
猜你喜欢的新闻
猜你喜欢的关注

新闻热点

疑难解答

图片精选

网友关注