try…catch… IE bug

有很多人写程序喜欢用try catch(还有一个finally), 尤其是Java程序员。当然这在Java里面是鼓励用的,用一句老外的话来说就是“Don‘t be ashamed to throw exceptions!”(虽然我没怎么写过java代码,但这句话却“深深地”被我记在心里了)。因为有些人总担心抛出异常是一种不负责的编码态度。不管怎么样,在Javascript里面使用它时却得慎重(JS中的try catch是从java里面学来的),使用try…catch的好处是明显的,能帮助程序员跟踪bug,但带来好处的同时,必然是要付出代价的。在理论上它会降低程序运行的性能,这点我想是可以肯定的。

今天这里不讲性能问题,想知道的自己搜索吧,有一大堆的资料讲这个问题。今天讲IE的一个bug,确切地讲是JScript的bug。(姑且称之为 bug,hoho,估计很多人会不同意它是个bug,只是IE的一个特性罢了),先上代码:

//test code
var e = 'I am a string';
try{
addlert('hello');
}catch(e){
//do sth.
}
alert(e);//In IE, 输出 [object Error], In FF, 输出 'I am a string';


从输出中可以知道,在IE下面变量e被异常覆盖了,这简直太匪夷所思了!但输出的结果总得相信吧,要不然你也别写代码了:)

再稍微简单地测试一下,我们就可以得出结论了:
在IE下面,catch捕获异常后,小括号里面的参数e的作用域是它所在的function(上面的例子没 function,其实就是整个window对象了)。

写js的人写久了,会用很简短的变量,比如就取了一个变量e,如果你又喜欢用try catch,这时如果不注意的话,你就等着怀具的降临吧。(我就写过这样的代码,查bug的时候都查了半天,查得我汗都快流下来了!)

我的建议是不到万不得已最好不要用try catch,至少写了这么长时间的js代码,我没遇到过非得用它的时候。有些人可能会说捕捉异常后,用合适的方式呈现给用户,会显得比较友好,至少不会直接在左下角多出一个黄色的警告图标出来。可能有一定的道理吧,虽然自己目前是搞UED的,但这方面的知识还不够深入,但光说也没人会相信,至少得拿出数据来说明一下,这样会让人比较信服。扯远了,今天写这个的目的并不在此。

最后,附上opera开发者论坛的一段话,相信会对大家有用:

The try-catch-finally construct is fairly unique. Unlike other constructs, it creates a new variable in the current scope at runtime. This happens each time the catch clause is executed, where the caught exception object is assigned to a variable. This variable does not exist inside other parts of the script even inside the same scope. It is created at the start of the catch clause, then destroyed at the end of it.

Because this variable is created and destroyed at runtime, and represents a special case in the language, some browsers do not handle it very efficiently, and placing a catch handler inside a performance critical loop may cause performance problems when exceptions are caught.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值