JavaScript 异常
转载自:http://www.cnblogs.com/aqbyygyyga/archive/2011/10/29/2228824.html(排版格式修改了一下)
一、错误处理的重要性
以前,javascript总是因为会出现奇怪的令人困惑的错误消息而知名,调试这种信息确实是一种痛苦的经历。因此,第四版的浏览器(IE4.0和Netscape4.0)包含了一些基本的错误处理功能。不久之后,ECMA和ECMASCript第三版中提出新的解决方案。最新的ECMAScript添加了异常处理机制,采用了从Java中移植过来的模型,第三版用ECMAScript第二版中的一些保留字实现了try…catch..finally结构以及throw操作符。
二、早期浏览器的错误处理
早期的浏览器(如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中,只有在同一线程中的代码会受到错误代码的影响。在其他线程中的代码和其他外部引用的文件中的代码,如果不依赖于包含错误的代码,则可以继 续执行,如:
<head>
<script type="text/javascript">
function handlerLoad() {
windows.open(“about:blank”);
}
function handleClick(){
alert(“click”);
}
</script>
</head>
<body onload =“handlerLoad()”>
<input type=“button” value=“test” onclick=“handlerClick()”/>
</body>
这段JS代码,页面载入时会报JS错误,但不会影响handleClick的执行。
四、处理错误
Javascript提供了两种特殊的错误处理方式。BOM包含一个onerror事件处理函数,这个window对象与图像对象上都有,同时ECMAScript定义了另一个从java中借鉴过来的try…catch结构来处理异常。
1、onerror事件处理函数
<SCRIPT LANGUAGE="JavaScript"> <!-- function handleError(){ alert("出错了"); return true; } window.onerror = handleError; //屏蔽所有的错误提示,很危险 //--> </SCRIPT> </HEAD> <BODY onload="handleLoad()"> </BODY> </HTML>
这样,网页出错,便会弹出”出错了“消息框”,但不幸的是网页仍会弹出错误提示框,如果想去掉这个提示框,改造如下:
function handleError()
{
alert("出错了");
return true;
}
2、取出错误信息
onerror事件处理函数提供了三种信息来确定错误确切的性质
1)错误信息—对于给定错误,浏览器会显示同样的信息
2)URL – 在哪个文件中发生了错误
3)行号 – 给定URL中发生的错误的行号
如:
<SCRIPT LANGUAGE="JavaScript"> <!-- function handleError(sMessage,sURL,sLine) { alert(“出错了.\n”+“消息:"+sMessage+"\nURL:"+sURL+ "\n出错行号:"+sLine); return true; } window.onerror = handleError; //--> </SCRIPT> //定制我们的错误提示
3、图像载入错误
<img src=“blue.gif” onerror=“alert(‘载入图像出错’)”/>
和window.onerror不同,img的onerror事件处理函数无任何额外消息的参数。图片没正常加载就会触发onerror事件,使用onerror事件处理函数的主要问题是,它是BOM 的一部分,所以,没有任何的标准能控制它们的行为。因此任何的浏览器使用这个事件处理函数处理错误的方式也明显不同。
如:IE中发生error事件时,正常的代码会继续执行;所有的变量和数据会保留下来,并可通过onerror事件处理函数访问。然而在mozilla中,正常的代码执行都会结束,同 时所有错误处理之前的变量和数据都会被销毁。
还有其浏览器根本不支持window对象上的onerror事件处理函数,但它们都支持图像上的onerror事件
4、try…catch语句
ECMAScript第三版支持try…catch…finally语法,基本语法:
try{
//code
}catch([exception]){
//code
}[finally{
//code
}]
如:
<SCRIPT LANGUAGE="JavaScript">
<!--
try{
alert("ok");
}catch(exception){
alert("an error processed");
}finally{
alert("finally");
}
alert("ok");
//-->
</SCRIPT>
注意:与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对象有以下特征:
1)name –表示错误类型的字符串
2)message – 实际的错误信息
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引擎执行JavaScript代码时,发生了错误,导致程序停止运行: △ 异常抛出:当异常产生,并且这个异常生成一个错误信息: △ 异常捕获: ...
- 处理JavaScript异常的正确姿势
译者按: 错误是无法避免的,妥善处理它才是最重要的! 原文: A Guide to Proper Error Handling in JavaScript Related Topics: 译者: Fu ...
- [六字真言]5.咪.功力不足,学习前端JavaScript异常
A Guide to Proper Error Handling in JavaScript 这是关于JavaScript中异常处理的故事.如果你相信 墨菲定律 ,那么任何事情都可能出错,不,一定会出 ...
- javascript 异常基本语法
http://www.w3school.com.cn/js/js_onerror.asp try...catch 的作用是测试代码中的错误. JavaScript - 捕获错误 当我们在网上冲浪时 ...
- JavaScript 异常 Exceptions
JavaScript提供了一套异常处理机制. 异常是干扰程序的正常流程的不寻常(但并非完全是出乎意料的)的事故. 当发现这样的事故时,你的程序应该抛出一个异常. throw语句中断函数的执行. 它应该 ...
- 松软科技Web课堂:JavaScript 异常
JavaScript 错误 - Throw 和 Try to Catch try 语句使您能够测试代码块中的错误. catch 语句允许您处理错误. throw 语句允许您创建自定义错误. final ...
- ArcGIS Javascript 异常之No 'Access-Control-Allow-Origin' header
本文只描述现象与处理措施,不讨论原理. 开发过程中遇到此异常,查询后网上说是跨域访问的问题,给出的解决方案是通过JQuery的跨域访问机制来解决, 难道我需要直接找ArcGISTiledMapServ ...
- javascript异常cannot read property xx of null 的错误
一般报这种异常或者错误,是因为试图从null中再读一个属性导致的. 比如:var myAttr=myObj.data.Name; 假如这个时候myObj.data是null,那么再试图读取data的N ...
- 4 JavaScript异常&debugger&保留关键字
try:语句测试代码块错误 catch:语句处理错误,一般提供一个对象如catch(err)用来存储错误信息 throw: 语句创建自定义错误,抛出的信息可以被catch捕获 JavaScript错误 ...
随机推荐
- Visitor
#include <iostream> #include <vector> using namespace std; #define DESTROY_POINTER(ptr) ...
- Eclipse HibernateTools安装
Hibernate Orm是个很强大的东东,可以将数据表映射成实体,EClipse安装了HibernateTools插件后可以生成pojo,配置xml等一系列自动化工作,为我们的开发减轻了很多. 下面 ...
- php字符串截取问题
希望将一个字符串限长显示,如果该字符串超过一定长数,就截取前n个字符,后加省略号. 但是在英文和汉字混合的情况下会出现如下问题: 如果有这样一个字符串 $str="这是一个字符串" ...
- Entity Framework 5问题集锦
ORM框架万万千,一直都使用NHibernate,没用过其他的.最近闲来学习下微软自家的Entity Framework,记录一些我学习过程中遇到的头疼问题.(不断更新中...) 教程:http:// ...
- jquery ajax跨域请求详解
本文章来给大家详细jquery中的ajax跨域请求, 在JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式.分别是JQuery的jquery.ajax jsonp格式和jque ...
- SQL Server自增长列插入指定值 -- SET IDENTITY_INSERT ON|OFF(转)
想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT 示例: 1.首先建立一个有标识列的表:CREATE TABLE products (i ...
- 2013-10-25笔记,css: mini-width, 标准居中,样式中*号使用,背景图像位置定位
mini-width:设置元素的最小宽度.該屬性值會對元素的寬度設置一個最小限制.因此,元素可以比制定值寬,但不能比制定值窄.不允許指定負值. 完美的居中佈局: body{text-align: ce ...
- C++求最小公倍数
题目内容:求两个正整数的最小公倍数. 输入描述:输入数据含有不多于50对的数据,每对数据由两个正整数(0<n1,n2<100000)组成. 输出描述:对于每组数据n1和n2,计算最小公倍数 ...
- delphi常用函数过程
数据类型转化 1.1. 数值和字符串转化 Procedure Str(X [: Width [ : Decimals ]]; var S); 将数值X按照一定格式转化成字符串S.Wid ...
- 访问svc 文件,编译器错误消息: CS0016,未能写入输出文件
编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS0016: 未 ...