这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
JavaScript 中的异常可以用 try..catch..finally 语句来处理,也可以手动的来抛出异常。
javascript 异常处理使用总结 try…catch…finally window.onerror
1. 使用 try..catch..finally 语句来处理异常js 代码在执行过程中如果出现异常,会手动创建一个异常类对象,该异常类对象将被提交给浏览器,这个过程称为 "抛出异常"。当浏览器接收到一场对象时,会寻找能处理这一异常的代码并把当前异常对象提交给其处理,这一过程被称为 "捕获异常"。try..catch..finally 语句的基本语法格式为:
- try{//可能抛出异常的代码
- }catch(error){//如果发生异常会执行的代码,error为发生的异常类对象
- }finally{//无条件执行的代码
- }
在上面的语句中,catch 语句紧跟在 try 语句的后面,finally 语句紧跟在 catch 的后面,这是一个完整的异常处理语句的写法。其实,catch 语句和 finally 语句都可以省略的,但是二者至少要保留其中之一和 try 语句结合使用。 在 try 块中的语句并不一定是要抛出异常的语句,任何 JavaScript 语句都可以使用异常处理语句来处理,但这样做没有必要。当 try 块中某一行的代码抛出了异常,则该行下方的代码将不会被执行,转而直接执行 catch 块的代码。 在 catch 块中,catch 语句后面括号中的 error 表示捕获到的异常对象实例,该实例包含异常的详细信息,可以根据这些信息作出适当的处理。如果 catch 语句后还有 finally 语句,则继续执行 finally 块中的语句。 finally 块中的语句是始终被执行的语句,块中的语句通常做一些最后的清理工作。如果在执行 finally 块之前,遇到 return 语句、continue 语句或 break 语句等转移流程的语句时,那么在执行这些语句前 finally 块中的代码也要被执行。 如果在一个异常处理语句中,只包含 try..finally 语句而没有补货异常的 catch 语句则执行 try 块中的语句后会直接执行 finally 块的语句,最后再将异常抛出。 例:
<script> try{ var date=new Date(); date.test();//调用date的未定义的test方法; document.wrire("try块执行结束<br>"); }catch(error){ with(document){ write("出现了异常<br>"); write("异常类型:"+error.name+"<br>"); write("异常消息:"+error.message); } }finally{ document.write("异常处理完毕!"); } </script>
结果: 出现了异常 异常类型:TypeError 异常消息:对象不支持此属性或方法异常处理完毕!
2. 手动抛出异常除了发生运行时浏览器会抛出异常,开发人员也可以自己动手抛出异常。手动异常抛出的语句是 throw,其基本语法格式为: throw expression;
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… 语法有以下三种形式
try{ //some code } catch(e){ //somecode } finally{ //some code } |
try{ //some code } catch(e){ //somecode } |
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语句在javascript1.4中已经实现。 try的语法很简单,如下
throwexpression;
其中的 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 < 0) throw new 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 对象和它的子类是在 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 代码中出现错误的时候,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++ < onerror.max) { alert("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 相关的错误。
参考资料
Mozilla Javascript1.5 核心参考
Javascript 犀牛 (JavaScript: The Definitive Guide)
来源: http://www.phperz.com/article/17/0420/287092.html