posts - 297,  comments - 1618,  trackbacks - 0
 

说明:参见《JavaScript高级程序设计》第14章。

 

一.             错误分类

1. 语法错误

也称为解析错误,发生在传统编程语言的编译时,在JavaScript中发生在解释时,这些错误是由代码中的意外字符直接引起的,然后就不能直接编译/解释,eg,在一行代码因缺少右括号,产生了语法错误。发生语法错误时,就不能继续执行代码。在JavaScript中,只有在同一个线程中的代码会受语法错误的影响。在其他线程中的代码和其他外部引用的文件中的代码,如果不依赖于包含错误的代码,则可以继续执行。

2. 运行时错误

也称为异常(exception,在编译期/解释器后)。此时,问题并不出在代码的语法上,而是,尝试完成的一个操作,在某些情况下是非法的。eg.

window.openMyFile();

因不存在openMyFile()方法,浏览器会返回一个异常。异常只影响发生的线程,其他JavaScript线程即可继续正常的执行。

 

二.             处理错误

1.       onerror事件处理函数

它是第一个用来协助JavaScript处理错误的机制。页面上出现异常时,error事件便在window对象上触发。Eg.

 

<html>
    
<head>
           
<title>onerror例子</title>
           
<script type="text/javascript">
                  window.onerror 
= function() {
       alert("发生错误!");
}

           
</script>
       
</head>
       
<body onload="fuction1()">
       
</body>
</html>

 

 在上述代码中,在页面载入时尝试调用不存在的函数,此时会引发一个异常。弹出“发生错误”的错误信息。但是,浏览器的错误信息也显示出来了,如何在浏览器上隐藏它呢,只需onerror方法返回一个true即可。

<script type="text/javascript">
     window.onerror 
= function() {
     alert(“发生错误!”);
     
return true;
}

</script>

 

1) 取出错误信息

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

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

 ii)URL——在哪个文件中发生了错误;

行号——给定URL中发生错误的行号。

访问方法见如下例子:

<script type="text/javascript">
           window.onerror 
= function(sMessage, sUrl, sLine) {
alert("发生错误!\n" 
+ sMessage + "\nURL:" + sUrl + "\nLine Number:" + sLine);
return true;
}

</script>

 

2) 图像载入错误

window对象并非唯一支持onerror事件处理函数的对象,它对图像对象也提供支持。当一个图像由于文件不存在等原因未能成功载入时,error事件便在这个图像上触发。让我们来看一个例子:

<img src=”amigo.jpg” onerror=”alert(‘载入图片时发生错误’)”/>

上例直接在HTML中分配onerror事件处理函数。当然也可以通过脚本来分配事件处理函数,在设置图像的src特性前,必须等待页面完全载入,代码如下:

<html>
    
<head>
           
<title>Image错误测试</title>
        
<script type="text/javascript">
                  
function handleLoad() {
       document.images[
0].onerror = function() {
       alert("载入图片时发生错误!");
}
;

document.images[
0].src = "amigo.jpg";
}

              
</script>
       
</head>
       
<body onload="handleLoad()">
              
<img/>
       
<body>
</html>

注意:与window对象的onerror事件处理函数不同,imageonerror事件任何的额外信息的参数。

3) 处理语法错误

onerror还能处理语法错误。但有一点必须注意,事件处理函数必须是页面中第一个出现的代码,因为如果语法错误出现在设置事件处理函数之前出现,事件处理函数就没有用了。

注意:语法错误会完全停止代码的执行。

说明:使用onerror事件处理函数的主要的问题是,它是BOM的一部分,所以,没有任何标准能控制它的行为。因此,不同的浏览器使用这个事件处理错误的方式有明显的不同,eg,在IE中发生error事件时,正常的代码会继续执行,所有的变量和数据都保留下来,并可通过onerror事件处理函数访问。在Mozilla中,正常的代码执行都会结束,同时所有的错误发生之前的变量和数据都被销毁。

 

2.       try…catch语句

ECMPScript第三版,引入了try…catch语句。Eg.

try {
        window.openFile1();
        alert("成功调用openFile1方法");
} catch (exception) {
        alert("发生异常!");
} finally {
        alert("try..catch测试结束!");
}

 

 Java不同,ECMAScript标准在try…catch语句中只能有一个catch语句,因为JavaScript是弱类型的语言,没办法指明catch子句中异常的特定类型。不管错误是什么类型,都由同一个catch语句处理。但Mozilla对其进行了扩展,可加多个catch语句,不推荐这样使用。

 finally用于包含无论是否有异常发生都要执行的代码,这对关闭打开的链接和释放资源很有用。

1) 嵌套try…catch语句

用来处理catch子句中的错误问题,让我们来看一个例子,代码如下:

try {
    eval("a ++ b");
} catch(oException) {
    alert("发生错误!");
    try {
      var aError = new Array(1000000000000000000000000000000000000000);
} catch(exception) {
      alert("在catch子句中发生错误!");
}
} finally{
       alert("已完成")
}

 

2) Error对象

发生错误时,JavaScript有个Error基类用于抛出。它有两个特性:

  i)name——表示错误类型的字符串

  ii)message——实际的错误信息。

Error对象的name对应于它的类,可以是如下值之一:

EvalError:错误发生在eval()函数中;

RangeError:数字值超出JavaScript可表示的范围;

ReferenceError:使用了非法的引用;

SyntaxError:在eval()函数调用中发生了语法错误,其他的愈发错误由浏览器报告,无法通过try…catch处理;

TypeError:变量的类型不是预期所需的;

URIError:在encodeURIdecodeURI函数发生了错误。

3) 判断错误类型

可采取如下两种方法来判断错误类型,第一种根据异常的name属性判断,如下:

 

try {
        eval("a ++ b");
} catch(oException) {
        if (oException.name = "SyntaxError") {
       alert("发生SyntaxError!");
} else {
       alert("发生其他错误!");
}

 

 第二中采用instanceof操作符,代码如下:

try {
        eval("a ++ b");
} catch(oException) {
       if (oException instanceof SyntaxError) {
       alert("发生SyntaxError!");
} else {
       alert("发生其他错误!");
}
}

 

4) 抛出异常的throw语句

ECMAScript第三版引入,用于有目的的抛出异常,抛出的错误对象可为字符串、数字、布尔值或实际的对象,也可以抛出Error对象(其构造函数只有一个函数,即错误信息)。eg1. throw new Error(“错误产生!”);

eg2.
function addTwoNumber(a, b) {

       if (arguments.length < 2) {

       throw new Error("需要传入两个数字!");

}

}

try {
       result = addTwoNumber(90);
} catch(oException) {
       if (oException instanceof SyntaxError) {
       alert("SyntaxError:" + oException.message);
} else if (oException instanceof Error){
       alert(oException.message);
}
}
posted on 2007-08-12 10:51 阿蜜果 阅读(3539) 评论(8)  编辑  收藏 所属分类: Javascript


FeedBack:
# re: JavaScript学习笔记——错误处理
2007-08-12 11:50 | pass86
good  回复  更多评论
  
# re: JavaScript学习笔记——错误处理
2007-08-12 16:38 | BeanSoft
厉害,支持一下.  回复  更多评论
  
# re: JavaScript学习笔记——错误处理[未登录]
2007-08-12 23:48 | -274°C
<script type=”text/javascript”>
window.onerror = function() {
alert(“发生错误!”);
return true;
}
</script>

呜呜,我这里一直没有按照你说的发生。在firefox里依然出现错误。“发生错误!”这个在IE ,ff下都没有出现了。。。。
onerror 方法,没有起作用了?  回复  更多评论
  
# re: JavaScript学习笔记——错误处理
2007-08-13 08:39 | 雪月
阿蜜果 的文章也不错哦。。。 看多了  回复  更多评论
  
# re: JavaScript学习笔记——错误处理[未登录]
2007-08-13 08:48 | 阿蜜果
@ -274°C
不好意思,其实是可以的,不过我的例子中字符有点不对,"都变成中文的“了
:)  回复  更多评论
  
# re: JavaScript学习笔记——错误处理
2007-08-13 10:25 | 杨爱友
写得好清晰,有耐心,有水平。继续其他章节。  回复  更多评论
  
# re: JavaScript学习笔记——错误处理[未登录]
2007-08-13 11:44 | -274°C
怪我,当时直接复制过来放到记事本保存就测试。看都没有看。不过记事本还是不容易发现符号问题。打开UE就一眼看到了。恩,谢谢了。  回复  更多评论
  
# re: JavaScript学习笔记——错误处理
2007-10-19 10:52 | 彭涛
太强了!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

      生活将我们磨圆,是为了让我们滚得更远——“圆”来如此。
      我的作品:
      玩转Axure RP  (2015年12月出版)
      

      Power Designer系统分析与建模实战  (2015年7月出版)
      
     Struts2+Hibernate3+Spring2   (2010年5月出版)
     

留言簿(262)

随笔分类

随笔档案

文章分类

相册

关注blog

积分与排名

  • 积分 - 2286611
  • 排名 - 3

最新评论

阅读排行榜

评论排行榜