js错误处理Try-catch和throw
1、try-catch语句
Try{ //可能会导致错误的代码 }catch(error){ //在错误发生时怎么处理 } 例如: try{ window.someNonexistentFunction(); }catch(error){ alert('an error happened'); //alert(error.message); }
如果try块中的任何代码发横了错误,就会立即退出代码执行过程,然后接着执行catch块。此时,catch块会接收到一个包含错误信息的对象。与在其他语言中不同的是面积是你不想使用这个错误对象,也要给他起个名字。这个对象中包含的实际信息会因浏览器而异,但共同的是有一个保存这错误信息的message属性。
1) finally子句
虽然在try-catch语句中是可选的,但finally子句一经使用,其代码无论如何都会执行。换句话说,try语句块中的代码全部正常执行,finally子句会执行。如果因为出错而执行了catch语句块,finally子句照样还会执行。甚至return语句,都不会组织finally子句的执行。来看下面这个函数:
function test(){ try{ return 2; }catch(error){ return 1 }finally{ return 0; } }
由于finally导致return 2;语句被忽略。也就是说这个函数只能返回0.如果把finally子句去掉,这个函数就返回2。
注:在使用finally子句之前,一定要非常清楚你想让代码怎么样。
2) 合理使用try-catch语句
当try-catch语句中发生错误时,浏览器会认为错误已经被处理了,因而不会通过本章前面讨论的机制记录或报告错误。对于那些不要求用户懂技术,也不惜要用于理解错误的web应用程序,这应该说是个理想结果。不过,try-catch能够让我们事先自己的错误处理;
使用try-catch最适合处理那些我们无法控制的错误。假设你在使用一个大型javascript库中的函数,该函数可能会有意无意地抛出一些错误。由于我们不能修改这个库的代码,所以大可将对该函数的调用放在try-catch语句中,万一有什么错误发生,也好恰当地处理它们。
在明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不合适了。
2、抛出错误throw
throw 123456; throw “hello”; throw true; throw {name:’javascript’};
以上代码都是有效的,在遇到throw 操作符时,代码会立即挺尸执行。仅当有try-catch语句捕获到被抛出的值时,代码才会继续执行。
例子:
function process(values){ if(!(values instanceof Array)){ throw new Error('process():Argument must be an Array'); } values.sorts(); for(var i=0,len=values.length;i<len;i++){ if(values[i]>10){ return values[i]; } } return -1; }
浏览器会像处理自己生成的错误一样,来处理这行代码抛出的错误。
3、处理错误策略
大体上来说,基本类型的值应该使用typeof来检测,而对象的值则应该使用instanceof来检测。
1)通讯错误
Url格式: http://www.yourdomain.com/?redir=http://www.sometherdomain.com?a=b&c=d 是不对的。会生成一下字符串: http://www.yourdomain.com/?redir=http:%3A%2Fwww.sometherdomain.com%3Fa%3Db%26%3Dd
对于查询字符串,应该记住必须使用encodeURIComponent()方法。
function addQueryStringAry(url,name,value){ if(url.indexOf('?')==-1){ url+="?"; }else{ url+="&"; } url+=encodeURIComponent(name)+"="+encodeURIComponent(value); return url; }
可以确保编码正确并避免相关错误。
2)可能的致命错误:
for (var i=0,len=mods.length;i<len;i++){ mods[i].init();//可能会导致致命错误 }
表面上看,这些代码没什么问题;问题在于任何模块的Init()方法如果出错,都会导致数组中后序的所有模块无法再进行初始化。可修改为:
for (var i=0,len=mods.length;i<len;i++){ try{ mods[i].init(); }catch(ex){ //在这里处理错误 logError('nonfatal','Module init failed:'+ex.message); } }
以下是几种避免浏览器相应js错误的方法:
1) 在可能发生错误的地方使用try-catch语句;
2) 使用window.onerror事件处理程序,这种方式可以接受try-catch不能处理的所有错误。
3) 首先,必须要明确什么是致命错误,什么是非致命错误。
4) 其次,再分析代码,以判断最可能发生的错误,原因主要如下
- 类型转换
- 未充分检测数据类型
- 发送给服务器或从服务器接收到的数据有误