有很多人写程序喜欢用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.
分享到:
相关推荐
4. **错误处理**:增加错误处理代码,捕获并处理可能出现的异常,例如`try-catch`块。 5. **兼容性函数**:编写兼容性函数,比如检查`window.FormData`是否存在,或者创建自定义的FormData模拟对象。 6. **JSONP或...
5. **使用`try...catch`块**:捕获可能的错误,并为IE提供备选方案,如回退到其他选择元素的方法。 压缩包中的文件"IE6789 bug.html"可能是用来重现或分析这个问题的一个示例页面。通过查看这个文件,开发者可以更...
JavaScript中的错误处理通常基于`throw`和`try/catch`结构。当发生错误时,Chakra引擎会捕获错误发生的调用链,即调用堆栈。如果错误对象是`Error`类型的实例或者是其原型链上的成员,Chakra就会生成一个可读的调用...
在JSON操作中使用try/catch结构可以增加容错性。 7. **CSS和HTML兼容性**:除了JavaScript,还需要注意CSS和HTML在IE9中的兼容性问题。使用Autoprefixer处理CSS前缀,确保HTML5标签在IE9中被正确解析。 解决这些...
由于其推出时间较早,因此在现代的Web开发中,IE6遇到了许多已知的问题和缺陷,其中包括在处理图片请求时的bug。在IE6中,当使用CSS将同一图片设置为多个元素的背景时,浏览器会为每个元素发起一个新的HTTP请求来...
然而在IE6浏览器中,这个简单的伪类规则却引发了一个让人头疼的BUG——背景图片在鼠标悬停时会出现短暂的闪动。 这个问题的主要原因在于IE6浏览器在处理:hover伪类时的特殊行为。当链接元素第一次加载时,浏览器会...
在使用jQuery库的$.ajax方法发起异步请求时,开发者遇到了一个特定于IE7浏览器的错误提示:“object doesn't support this property or method”,翻译成中文意为“对象不支持此属性或方法”。根据描述,此问题仅在...
#9897:try-catch isPlainObject detection #10076:$.inArray crashes IE6 and Chrome if second argument is `null` or `undefined` CSS #6652:Remove filter:alpha(opacity=100) after animation #9572:...
然而,在早期版本中,`isFunction`函数在Internet Explorer (IE) 浏览器中存在BUG,导致它无法正确地识别一些原生DOM方法和函数如`alert`等。 在IE浏览器中,使用`typeof`检测某些方法(比如`alert`、`confirm`)...
<title>IE6-IE9中tbody的innerHTML不能复制bug <tr><td>aaa</td></tr> <button id="btn1">GET <button id="btn2">SET var tbody = document.getElementsByTagName('tbody')[0]; function ...
这是一个在IE中常见的兼容性bug,由于IE对某些API的实现与现代浏览器不同,导致编辑器在某些操作上出现异常。解决这个问题的方法是在代码中添加try-catch块来处理可能的错误。修改`kingEditor.js`的相应行,用try-...
11. **try-catch位置不当**:异常处理的错误定位可能导致真正的问题被掩盖,使得问题更难找到。 12. **小bug大麻烦**:看似简单的bug修改,有时会引发连锁反应,导致整个系统的稳定性受到影响,甚至造成服务器宕机...
ajaxfileupload.js可以兼容IE8以下版本实现无刷新的Form提交,上传文件。 这个版本修改了提交后台失败的几个bug 使用是需注意以下几点: 1.调用createUploadForm,此方法中增加了change参数,此参数用户给新生成的...
在Webkit内核浏览器中,当尝试使用iframe来加载不同域的页面,并且在JavaScript中利用try...catch结构来捕获因跨域而导致的错误时,会直接抛出错误信息,而不是抛出异常让JavaScript代码捕获,这与IE和Firefox等...
2. **异常处理**:合理使用try-catch语句,确保测试过程的连续性。 3. **日志记录**:记录测试过程中的重要信息,便于问题排查。 4. **持续集成**:将Selenium测试集成到持续集成工具(如Jenkins)中,实现自动化...
一个已知的IE bug是,当你尝试动态构造一个函数并用`eval()`执行时,返回的结果可能是`undefined`,而在其他浏览器中则会返回构造的函数引用。为了解决这个问题,可以在`eval()`的参数前添加"0,",这样在所有主流...
C#编程外行,可能用的很不科学,特别是容错机制,但基本思想已经表达,代码还有很多bug,有建议的请跟帖到:sosecretblog.blogspot.com 利用该方法加密,然后再结合其他加密方式,比如AES,DES等,可以有效的保证你...