javascript异常处理

}错误处理的重要性

以前,javascript总是因为会出现奇怪的令人困惑的错误消息而知名,调试这种信息确实是一种痛苦的经历。

因此,第四版的浏览器(ie4.0和netscape4.0)包含了一些基本的错误处理功能。不久之后,ecma和ecmascript第三版中提出新的解决方案。

最新的ecmascript添加了异常处理机制,采用了从java中移植过来的模型,第三版用ecmascript第二版中的一些保留字实现了try…catch..finally结构以及throw操作符

1.1、早期浏览器的错误处理

早期的浏览器(如ie3.0)没有错误处理。函数通过返回一个无效值(一般是null、false或-1,根据不同的函数不同)来表示发生了错误,考虑以下代码:

var index = findcolor(colorarray,”red”);

if (index==-1)

alert(“该项不存在”);

else

alert(“该项的位置是:”+index);

以上的问题在于函数findcolor的返回值-1无从判断是没有找到还是出错了。

错误和错误处理将帮助我们解决这个问题

在javascript引入错误处理后,web开发人员就可以更好的对代码进行控制了。好的错误处理技术可以让脚本的开发、测试和部署更流畅。js尤为如此,因为它缺乏标准的开发环境来指导开发人员。

}错误和异常

错误的类型无外两种:语法错误和运行时错误

1、语法错误

传统编程语言编译时解析错误,在javascript中发生在解释时。这些错误是由代码中的意外字符直接造成的。然后就不能完全编译/解释了,如:

window.alert(“test”

不过,在javascript中,只有在同一线程中的代码会受到错误代码的影响。在其他线程中的代码和其他外部引用的文件中的代码,如果不依赖于包含错误的代码,则可以继续执行

如:

这段js代码,页面载入时会报js错误,但不会影响handleclick的执行

}处理错误

javascript提供了两种特殊的错误处理方式

bom包含一个onerror事件处理函数,这个window对象与图像对象上都有

同时ecmascript定义了另一个从java中借鉴过来的try…catch结构来处理异常

uonerror事件处理函数

function handleerror(){

alert("出错了");

return true;}

window.onerror = handleerror; //屏蔽所有的错误提示,很危险

//-->

这样,网页出错,便会弹出”出错了“消息框”,但不幸的是网页仍会弹出错误提示框

如果想去掉这个提示框,改造如下:

}function handleerror()

}{

}alert("出错了");

}return true;

}}

u取出错误信息

onerror事件处理函数提供了三种信息来确定错误确切的性质

ü错误信息—对于给定错误,浏览器会显示同样的信息

üurl – 在哪个文件中发生了错误

ü行号 – 给定url中发生的错误的行号

如:

function handleerror(smessage,surl,sline) {

alert(“出错了.\n”+“消息:"+smessage+"\nurl:"+surl+

"\n出错行号:"+sline);

return true; }

window.onerror = handleerror;

//-->

//定制我们的错误提示

图像载入错误

载入图像出错’)”/>

和window.onerror不同,img的onerror事件处理函数无任何额外消息的参数.

图片没正常加载就会触发onerror事件

使用onerror事件处理函数的主要问题是,它是bom的一部分,所以,没有任何的标准能控制它们的行为。因此任何的浏览器使用这个事件处理函数处理错误的方式也明显不同。

如:ie中发生error事件时,正常的代码会继续执行;所有的变量和数据会保留下来,并可通过onerror事件处理函数访问。然而在mozilla中,正常的代码执行都会结束,同时所有错误处理之前的变量和数据都会被销毁。

还有其浏览器根本不支持window对象上的onerror事件处理函数,但它们都支持图像上的onerror事件

try…catch语句

ecmascript第三版支持try…catch…finally语法

基本语法:

try{

//code

}catch([exception]){

//code

}[finally{

//code

}]

如:

alert("ok");

}catch(exception){

alert("an error processed");

}finally{

alert("finally");

}

alert("ok");

//-->

注意:与java语言不同的是:不支持多重catch语句,但支持嵌套catch语句

如:try{ var a = document.getelementbyid("txtuser");

alert(a.value);

}catch(ex) {

alert(“error”);

}

再如: 弹出详细错误信息try{var a = document.getelementbyid("txtuser");

alert(a.value);

}catch(ex) {

alert(ex.message); //error

}

try{ var a = document.getelementbyid("txtuser");

alert(a.value);

}catch(ex)

{try{

alert(oexception.message);}

catch (ex){

alert(ex.message);}}

}error对象

类似于java的错误基类exception,javascript有个基类error,error对象有以下特征:

pname –表示错误类型的字符串

pmessage – 实际的错误信息

error对象的名称对应于它的类,可以是以下值之一

1、evalerror: 错误发生在eval()函数中

2、rangeerror:数字的值超过javascript可表示的范围

3、referenceerror: 使用了非法的引用

4、syntaxerror: 在eval()函数调用中发生了语法错误。

5、typeerror:变量的类型不是预期所需的

6、urierror: 在encodeuri()或者decodeuri()函数中发生的错误

说明:mozzilla和ie均扩展了error对象,如ie中提供了一个number特性来表示错误代号,也可用description代替message

错误类型判断 二种方法:

方法1:通过name属性判断

方法2:通过instanceof操作符

如:try{var scriptstr =" var a=0;var b=1;var c=a++b;alert(c)";

eval(scriptstr);

}catch(ex)

{if (ex instanceof syntaxerror)

{alert("语法出错了");} }

抛出异常

ecmascript还引入throw语句,用于有目的的抛出异常

语法如下:throw error_object

error_object可以是字符串、数字、布尔值或是实际的对象。如:

throw “an error occurred”;

throw 5007;throw true;

throw new object();

throw new error();

throw new error(“error”);

throw new error(10001,”error”);

优化javascript

javascript是作为源代码下载,然后浏览器对其进行 解释的(不存在编译问题),因此javascript的性能就体现在速度方法,而速度又被分割成两部分:下载时间和执行速度

1、 下载时间: 使用java等其他语言我们可以不必考虑100个字符长的变量名及大量的注释.因为这些在编译后名称会被替换掉,注释也会被自动删除,但javascript开发人员,就没有这么爽了!

增加下载时间的关键因素是脚本所包含的字节数.

记住一个关键数字1160;这是能放入单个tcp-ip包中的字节数。最好能将每个javascript文件都保持在1160字节以下以获取最优的下载时间

减小代码下载的时间方法:

ü删除注释

ü删除制表符和空格

ü删除所有的换行

ü替换变量名

如:function dosomthing(sname,sage,scity)

=> function dosomthing(a,b,c)

推荐一个工具:ecmascript cruncher

下载地址:http://www.saltstorm.net/depo/esc/

如:c:\>cscript c:\esc-1.14\esc.wsf -l [0-4] -ow outputfile.js inputfile1.js [inputfile2.js]

说明:

cscript是windows shell脚本解释程序。

[0-4]是一个压缩等级

-ow 表示下一个参数是优化后输出的文件名,最后剩下的是要优化的js文件

esc支持以下四个优化等级

等级

描述

0

不改变脚本,将多个文件合并到单个文件

1

删除所有注释

2

除等级1个,再删除额外的制表符和空格

3

除等级2外,再删除换行

4

除等级3个,再进行变量名替换

其他减少字节数的方法

ü替换布尔值

相对于比较来说:true等于1,false等于0.因此脚本包含的字面量true都可以用1来替换,而false可以用0替换

如:var bfound=false;

for(var i=0;i好文要顶关注我收藏该文与我联系


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值