转载:全面介绍javascript异常处理(try…catch…finally window.onerror)
- 博客分类:
- 技术杂绘
转载:全面介绍javascript异常处理(try…catch…finally window.onerror)
2010年08月18日
转载:全面介绍javascript异常处理(try…catch…finally window.onerror)
http://snap.oncoding.cn/javascript/base/article200 907/216.html
try catch finally 语句说明
try catch finally是javascript语言提供的异常处理机制。语法结构如下
try {
//这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
}
catch (e) {
// 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
//e是一个局部变量,用来指向Error对象或者其他抛出的对象
}
finally {
//无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
}
try…catch…finally…语法中除了try以外catch和finally都是可选的(两者必须要有一个),也就是说try…catch…finally…语法有以下三种形式
1 try{ //some code }catch(e){ //somecode }finally{ //some code } 2 try{ //some code }catch(e){ //somecode } 3 try{ //some code }finally{ //some code }
如果有一定catch,一旦try中代码抛出异常以后就是先执行catch中的代码,然后执行finally中的代码。如果没有catch语句,try中的代码抛出异常后,就会先执行finally中的语句,然后将try中抛出的异常以异常的方式继续往上抛。
不管try代码块的执行时如何被终止的(出现异常、return、自然终止)finally中的语句始终会被执行,正是由于finally的这种特性,通常finally用来执行一些清理工作。如果try中代码是以return,continue,break的方式终止的,Javascript引擎会在执行完finally中的语句以后再执行相应的try中的返回语句。
throw语句说明
throw语句在javascript1.4中已经实现。try的语法很简单,如下
throw expression;
其中的expression可以是任何一种类型,也就是说throw “There is a error” 或是throw 1001都是正确的。但通常我们会抛出一个Error对象或是Error对象的子类。关于Error我们稍后介绍,先看一段throw的样例代码。
function factorial(x) { // If the input argument is invalid, throw an exception! if (x Error("x must not be negative"); // Otherwise, compute a value and return normally for(var f = 1; x > 1; f *= x, x--) /* empty */ ; return f; }
Error对象
Error对象和它的子类是在javascript1.5中实现的。Error的构造函数有两种
new Error( )
new Error(message )
Error有两个基本的属性name和message。message用来表示异常的详细信息。而name指的的是Error对象的构造函数。此外,不同的js引擎对Error还各自提供了一些扩展,例如mozilla提供了fileName(异常出现的文件名称)和linenumber(异常出现的行号)的扩展,而IE提供了number(错误号)的支持。不过name和message是两个基本的属性,在firefox和ie中都能够支持。Javascript中Error还有几个子类EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError,各自的意思就不在这里详细描述了,读者可以在我提供的参考文档中找到相应的参考。
Javascript的异常处理机制和window.onerror句柄
当javascript代码中出现错误的时候,js引擎就会根据js的调用栈逐级寻找对应的catch,如果没有找到相应的catch handler或catch handler本身又有error或者又抛出新的error,最后就会把这个error的处理交给浏览器,浏览器会用各自不同的方式(IE以黄色三角图案显示在左下角,而firefix会显示在错误控制台中)显示错误信息给访问者。很多场景下,我们会觉得这种错误提示方式不够友好,而且提示信息很隐蔽,那么我们机会自定义这种错误提示的方式吗?答案是有,就是window.onerror属性。
javascript的window对象有一个特别的属性onerror,如果你将某个function赋值给window的onerror属性,那么但凡这个window中有javascript错误出现,该function都会被调用,也就是说这个function会成为这个window的错误处理句柄。
// Display error messages in a dialog box, but never more than 3
window.onerror = function(msg, url, line) { if (onerror.num++ ERROR: " + msg + "\n" + url + ":" + line); return true; } } onerror.max = 3; onerror.num = 0;
onerror句柄会3个参数分别是错误信息提示,产生错误的javascript的document ulr,错误出现的行号。
onerroe句柄的返回值也很重要,如果句柄返回true,表示浏览器无需在对该错误做额外的处理,也就是说浏览器不需要再显示错误信息。而如果返回的是false,浏览器还是会提示错误信息。
window.onerror=function(){ alert(”xx”); return true; //如果注释掉该语句,浏览器中还是会有错误提示,反之则没有。 } function throwerror(){ throw new Error(”cc”); }
我们在开发HTML的过程中避免不了一些Js的异常,通常我们也不可能依赖客户打开浏览器的错误提示框(如上图)来为我们定位bug提供线索,而利用window.onerror句柄我们就可以讲错误提示信息显示出来,客户只要在错误出现的时候,提供相应的截屏就可以了,这点可以很好的帮助开发人员定位,分析javascript相关的错误。
CSDN 资料
http://topic.csdn.net/u/20100818/16/27b3d085-d9ce- 43cd-94cd-cf09339f6859.html?007070039746822399
可见,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捕捉错误是比较标准的做法。
发表评论
-
【援引】中考酡语语法总温虾讪项实战练习练习
2012-01-20 11:34 701【援引】中考酡语语法总温虾讪项实战练习练习 2012年01月 ... -
花瓣采集js解析-greatqn-博客园
2012-01-20 11:34 1634花瓣采集js解析-greatqn-博客园 2012年01月1 ... -
linux下程序开发-复合语句及输入输出.笔记
2012-01-20 11:33 858linux下程序开发-复合语句及输入输出.笔记 2010年0 ... -
javascript异常处理-乾蓝洛-博客园
2012-01-19 16:25 454javascript异常处理-乾蓝洛-博客园 2011年10 ... -
《JavaScript高级程序设计》学习笔记――错误处理与调试
2012-01-19 16:25 650《JavaScript高级程序设计》学习笔记――错误处理与调试 ... -
ecshop transport.js/run() error:undefined
2012-01-19 16:25 718ecshop transport.js/run() error ... -
Handling metadata and cue points in Flash video(AsyncErrorEvent text=Error #2095 flash.net.NetStream)
2012-01-19 16:25 915Handling metadata and cue point ... -
小学生作文教学生活化
2012-01-17 06:08 573小学生作文教学生活化 2010年07月22日 小学 ... -
如何提高小学生写作文的能力
2012-01-17 06:08 696如何提高小学生写作文 ... -
提高小学生作文能力的几种基本方法
2012-01-17 06:08 615提高小学生作文能力的 ... -
小学生作文训练
2012-01-17 06:08 489小学生作文训练 2011年0 ... -
2011、一切已成为神马、不再浮云
2012-01-16 04:50 5762011、一切已成为神马、 ... -
成绩神马的是浮云对不对
2012-01-16 04:50 604成绩神马的是浮云对不对 2012年01月13日 今天是1 ... -
神马都是浮云~ ~我们的第一个学期
2012-01-16 04:49 570神马都是浮云~ ~我们的第一个学期 2012年01月13日 ... -
神马都是浮云是不是好题目
2012-01-16 04:49 498神马都是浮云是不是好题目 6小时前 喜欢一个人听喜欢的歌 ... -
神马都是浮云
2012-01-16 04:49 511神马都是浮云 2011年12月31日 那一年还没有猫扑 ...
相关推荐
主要帮助大家理解javascript中try...catch...finally,从浅入深,一步步掌握javascript中try...catch...finally的使用方法,感兴趣的小伙伴们可以参考一下
try-catch-finally.js 843字节库,可在JavaScript中更灵活地捕获错误。内容注意事项按名称捕获可能不起作用按类型捕获在跨框架/过程中不起作用错误被消耗测验 安装 浏览器< script src =" try-catch-finally.js ...
javascript中window.confirm这个方法很好用,可以弹出一个确认对话框我们之所以弹出这个对话框,可能就是因为该操作很危险,所以要用户确认。但如果默认选择”确定”,则可能违背了这个原则。 另外,confirm对话框的...
对window.open进行封装, 使其更好用, 且更兼容, 很多人说window.open不兼容,其实不是, 因为不能直接执行, 必须通过用户手动触发才行;看代码: 代码如下 var openWindow = function(url, options) { var str = ""; ...
javascript 打开页面window.location和window.open的区别.docx
使用try..catch..finally语句来处理异常 js代码在执行过程中如果出现异常,会手动创建一个异常类对象,该异常类对象将被提交给浏览器,这个过程称为“抛出异常”。当浏览器接收到一场对象时,会寻找能处理这一异常的...
window.loadAcp){window.loadAcp = true;let url;$axure.internal($ax => {url = $ax.globalVariableProvider.getVariableValue('AxhubJsLink')});$axure.utils.loadJS(url || '...
window.open使用方法以及参数说明一、window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二、基本语法: window.open(pageURL,name,parameters) 其中: pageURL 为子窗口路径 name 为子窗口...
动机捕获 JavaScript 中抛出的所有异常。 在错误的来源处捕获错误。 能够在alpha 测试时记录错误并将错误发送到服务器。 受到和 node.js 的uncaughtException事件的。 确定 try/catch 块在不应该使用的地方使用。...
javaScript异常处理文档,当遇到JavaScript等异常问题时可翻阅本文档寻找答案
网页开发手记:486 个JavaScript 网页特效详解.pdf
It was tested in the latest Google Chrome with the *Enable Experimental JavaScript* flag enabled in `chrome://flags/#enable-javascript-harmony` and in the latest Mozilla Firefox with the *dom.dialog_...
NULL 博文链接:https://jiangzhenwei6.iteye.com/blog/735102
:rocket: 不试 :rocket: 删除那些难看的try-catch-finally块,清理代码库! :smiling_face_with_heart-eyes: 关于在可能期望方法throw的代码库中工作可能会导致逻辑包裹在try-catch块中的情况。 它还导致其他代码...
在JavaScript可以使用try...catch来进行异常处理,下面有个不错的示例,大家可以参考下,希望对大家有所帮助
window.event.keycode值大全,内含javascript中所有键盘键值,查找方便简单。
javascript 中的try catch应用总结 实例代码: [removed] try { throw new Error(10,"asdasdasd") } catch (e) ...在JavaScript可以使用try…catch来进行异常处理。例如: try { foo.bar(); } catch
本文较为详细的分析了JavaScript中window.open用法。分享给大家供大家参考。具体如下: 代码如下:[removed] window.open (‘page.html’, ‘newwindow’, ‘height=100, width=400, top=0, left=0, toolbar=no, ...
JavaScript_window.setTimeout()_的详细用法
try-wrapper输入Javascript脚本字符串,然后利用try catch将其包裹起来,基于构建的前端错误捕获工具。Example 1var wrapper = require('try-wrapper');console.log( wrapper('function test() { console.log("hello...