JavaScript高级程序设计阅读笔记(二十)js错误处理
2023-06-13 09:14:35 时间
一、错误分类
1、语法错误:也称解析错误,发生在传统语言的编译时,在JavaScript中发生在解释时。这些错误是由代码中的意外字符直接引起的,然后就不能直接编译/解释。发生语法错误时,就不能继续执行代码。在JavaScript中,只有在同一个线程中的代码会受语法错误的影响。在其他线程中的代码和其他外部引用的文件中的代码,如果不依赖于包含错误的代码,则可以继续执行。
2、运行时错误:也称为异常(exception,在编译期/解释器后)。此时,问题并不出在代码的语法上,而是,尝试完成的一个操作,在某些情况下是非法的。异常只影响发生的线程,其他JavaScript线程即可继续正常的执行。
二、错误处理
JavaScript提供了两种处理错误的方式:BOM中的onerror事件处理函数方式和ECMAScript中的try...catch方式。
1、onerror事件处理函数
它是第一个用来协助JavaScript处理错误的机制。页面上出现异常时,error事件便在window对象上触发。例如:
复制代码代码如下:
1、语法错误:也称解析错误,发生在传统语言的编译时,在JavaScript中发生在解释时。这些错误是由代码中的意外字符直接引起的,然后就不能直接编译/解释。发生语法错误时,就不能继续执行代码。在JavaScript中,只有在同一个线程中的代码会受语法错误的影响。在其他线程中的代码和其他外部引用的文件中的代码,如果不依赖于包含错误的代码,则可以继续执行。
2、运行时错误:也称为异常(exception,在编译期/解释器后)。此时,问题并不出在代码的语法上,而是,尝试完成的一个操作,在某些情况下是非法的。异常只影响发生的线程,其他JavaScript线程即可继续正常的执行。
二、错误处理
JavaScript提供了两种处理错误的方式:BOM中的onerror事件处理函数方式和ECMAScript中的try...catch方式。
1、onerror事件处理函数
它是第一个用来协助JavaScript处理错误的机制。页面上出现异常时,error事件便在window对象上触发。例如:
<html>
<head>
<title>onerrorExample</title>
<scripttype="text/javascript">
window.onerror=function(){
alert("发生错误!");
}
</script>
</head>
<bodyonload="nonExistentFunction()">
</body>
</html>
在上述代码中,在页面载入时尝试调用不存在的函数,此时会引发一个异常。弹出“发生错误”的错误信息。但是,浏览器的错误信息也显示出来了,如何在浏览器上隐藏它呢,只需onerror方法返回一个true即可。
<scripttype="text/javascript">
window.onerror=function(){
alert(“发生错误!”);
returntrue;
}
</script>
1.1取出错误信息
onerror处理函数提供了三种信息来确定错误确切的性质:
i)错误信息——对于给定错误,浏览器会显示同样的信息
ii)URL——在哪个文件中发生了错误
iii)行号——给定URL中发生错误的行号。
window.onerror=function(sMessage,sUrl,iLine){
alert("发生错误!\n"+sMessage+"\nURL:"+sUrl+"\nLineNumber:"+iLine);
returntrue;
}
1.2图像载入错误
window对象并非唯一支持onerror事件处理函数的对象,它对图像对象也提供支持。当一个图像由于文件不存在等原因未能成功载入时,error事件便在这个图像上触发。例如:
<imgsrc="noexist.gif"onerror="alert("载入图片时发生错误")"/>
上例直接在HTML中分配onerror事件处理函数。因为noexist.gif不存在,所以会弹出警告框提示用户。当然也可以通过脚本来分配事件处理函数,在设置图像的src特性前,必须等待页面完全载入,例如:
<html>
<head>
<title>Image错误测试</title>
<scripttype="text/javascript">
functionhandleLoad(){
document.images[0].onerror=function(){
alert("载入图片时发生错误!");
};
document.images[0].src="amigo.jpg";
}
</script>
</head>
<bodyonload="handleLoad()">
<img/>
<body>
</html>
注意:与window对象的onerror事件处理函数不同,image的onerror事件没有任何关于额外信息的参数。
1.3处理语法错误
onerror事件处理函数不仅可以处理异常,它还能处理语法错误,也只有它才能处理。
首先,事件处理函数必须是页面中第一个出现的代码,因为如果语法错误出现在设置事件处理函数之前出现,事件处理函数就没有用了。记住,语法错误会完全停止代码的执行。例如:
<html>
<head>
<title>onErrorExample</title>
<scripttype="text/javascript">
alert("Syntaxerror.";
window.onerror=function(sMessage,sUrl,iLine){
alert("Anerroroccurrred:\n"+sMessage+"\nURL:"+sUrl+"\nLineNumber:"+iLine);
returntrue;
}
</script>
</head>
<bodyonload="nonExistentFunction()">
</body>
</html>
因为突出显示的那一行代码(里面有错误语法)在分配onerror事件处理函数之前就出现了,所以浏览器直接报告这个错误。在错误之后的代码就不再被解释(因为这个线程已经退出了),所以load事件解发时调用nonExistentFunction(),浏览器也会报这个错误。书中说如果重写这个页面,将onerror事件处理函数的分配放在语法错误之前,那么会出现两个警告框:一个显示语法错误,另一个显示异常。但我测试的结果还是一样的报两个错误,并不显示onerror事件中的信息。
使用onerror事件处理函数的主要的问题是,它是BOM的一部分,所以,没有任何标准能控制它的行为。因此,不同的浏览器使用这个事件处理错误的方式有明显的不同,eg,在IE中发生error事件时,正常的代码会继续执行,所有的变量和数据都保留下来,并可通过onerror事件处理函数访问。在Mozilla中,正常的代码执行都会结束,同时所有的错误发生之前的变量和数据都被销毁。
2、try...catch方式
ECMPScript第三版,引入了try…catch语句。基本语法如下:
try{
//code
[break;]
}catch([exception]){
//code
[break;]
}[finally{
//code
}]
例如:
try{
window.openFile1();
alert("成功调用openFile1方法");
}catch(exception){
alert("发生异常!");
}finally{
alert("try..catch测试结束!");
}
与Java不同,ECMAScript标准在try…catch语句中只能有一个catch语句,因为JavaScript是弱类型的语言,没办法指明catch子句中异常的特定类型。不管错误是什么类型,都由同一个catch语句处理。Mozilla对其进行了扩展,可加多个catch语句,但因为只有Mozilla可以使用,因此不推荐使用。
finally用于包含无论是否有异常发生都要执行的代码,这对关闭打开的链接和释放资源很有用。
2.1嵌套try...catch语句
在try...catch语句中的catch子句中,也会发生错误。此时,就可以使用嵌套的try...catch语句。示例:
try{
eval("a++b");
}catch(oException){
alert("发生错误!");
try{
varaError=newArray(1000000000000000000000000000000000000000);
}catch(exception){
alert("在catch子句中发生错误!");
}
}finally{
alert("已完成")
}
2.2Error对象
发生错误时,JavaScript有个Error基类用于抛出。它有两个特性:
i)name——表示错误类型的字符串
ii)message——实际的错误信息
Error对象的name对应于它的类,可以是如下值之一:
EvalError:错误发生在eval()函数中;
RangeError:数字值超出JavaScript可表示的范围;
ReferenceError:使用了非法的引用;
SyntaxError:在eval()函数调用中发生了语法错误,其他的愈发错误由浏览器报告,无法通过try…catch处理;
TypeError:变量的类型不是预期所需的;
URIError:在encodeURI或decodeURI函数发生了错误。
2.3判断错误类型
尽管每个try...catch语句中只能有一个catch子句,但判断抛出的错误类型方法主要有两种。第一种使用Error对象的name特性:
try{
eval("a++b");
}catch(oException){
if(oException.name="SyntaxError"){
alert("发生SyntaxError!");
}else{
alert("发生其他错误!");
}
}
第二种使用instanceof操作符,并使用不同错误的类名:
try{
eval("a++b");
}catch(oException){
if(oExceptioninstanceofSyntaxError){
alert("发生SyntaxError!");
}else{
alert("发生其他错误!");
}
}
2.4抛出异常
在ECMAScript第三版引入,用于有目的的抛出异常,抛出的错误对象可为字符串、数字、布尔值或实际的对象,也可以抛出Error对象(其构造函数只有一个函数,即错误信息)。如:
thrownewError("错误产生!");
开发人员抛出的错误和由浏览器自身抛出的错误都在try...catch中捕获。例如:
functionaddTwoNumber(a,b){
if(arguments.length<2){
thrownewError("需要传入两个数字!");
}
}
try{
result=addTwoNumber(90);
}catch(oException){
if(oExceptioninstanceofSyntaxError){
alert("SyntaxError:"+oException.message);
}elseif(oExceptioninstanceofError){
alert(oException.message);
}
}
三、调试技巧
现在的浏览器大多都自带了调试工具,大多数情况下已经够用了,另外IE下还可以用IETest,FireFox下还可以用FireBug。
作者:Artwl
出处:http://artwl.cnblogs.com
相关文章
- html js 全局 变量,JS定义全局变量
- js动画事件_JavaScript事件
- JavaScript连接Oracle数据库配置指南(js连接oracle配置)
- JavaScript探索之旅掌握Oracle和JS的完美融合(js与oracle)
- JavaScript进阶教程(第二课)
- Javascript入门学习第一篇js基础
- 说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
- JavaScript学习笔记(十六)js事件
- JavaScript(JS)压缩/混淆/格式化批处理工具
- JavaScript学习笔记(一)js基本语法
- javascript学习笔记(二)js一些基本概念
- JavaScript高级程序设计阅读笔记(十七)js事件
- JavaScript高级程序设计(第3版)学习笔记6初识js对象
- javascript学习(一)构建自己的JS库
- Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
- javascript日期对象格式化为字符串的实现方法
- js(JavaScript)实现TAB标签切换效果的简单实例
- JavaScript学习笔记之JS函数