转载自: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 异常的更多相关文章

  1. JavaScript异常捕获

    理论准备 ★   异常捕获 △ 异常:当JavaScript引擎执行JavaScript代码时,发生了错误,导致程序停止运行: △ 异常抛出:当异常产生,并且这个异常生成一个错误信息: △ 异常捕获: ...

  2. 处理JavaScript异常的正确姿势

    译者按: 错误是无法避免的,妥善处理它才是最重要的! 原文: A Guide to Proper Error Handling in JavaScript Related Topics: 译者: Fu ...

  3. [六字真言]5.咪.功力不足,学习前端JavaScript异常

    A Guide to Proper Error Handling in JavaScript 这是关于JavaScript中异常处理的故事.如果你相信 墨菲定律 ,那么任何事情都可能出错,不,一定会出 ...

  4. javascript 异常基本语法

    http://www.w3school.com.cn/js/js_onerror.asp try...catch 的作用是测试代码中的错误.   JavaScript - 捕获错误 当我们在网上冲浪时 ...

  5. JavaScript 异常 Exceptions

    JavaScript提供了一套异常处理机制. 异常是干扰程序的正常流程的不寻常(但并非完全是出乎意料的)的事故. 当发现这样的事故时,你的程序应该抛出一个异常. throw语句中断函数的执行. 它应该 ...

  6. 松软科技Web课堂:JavaScript 异常

    JavaScript 错误 - Throw 和 Try to Catch try 语句使您能够测试代码块中的错误. catch 语句允许您处理错误. throw 语句允许您创建自定义错误. final ...

  7. ArcGIS Javascript 异常之No 'Access-Control-Allow-Origin' header

    本文只描述现象与处理措施,不讨论原理. 开发过程中遇到此异常,查询后网上说是跨域访问的问题,给出的解决方案是通过JQuery的跨域访问机制来解决, 难道我需要直接找ArcGISTiledMapServ ...

  8. javascript异常cannot read property xx of null 的错误

    一般报这种异常或者错误,是因为试图从null中再读一个属性导致的. 比如:var myAttr=myObj.data.Name; 假如这个时候myObj.data是null,那么再试图读取data的N ...

  9. 4 JavaScript异常&debugger&保留关键字

    try:语句测试代码块错误 catch:语句处理错误,一般提供一个对象如catch(err)用来存储错误信息 throw: 语句创建自定义错误,抛出的信息可以被catch捕获 JavaScript错误 ...

随机推荐

  1. C puzzles详解【13-15题】

    第十三题 int CountBits(unsigned int x) { ; while(x) { count++; x = x&(x-); } return count; } 知识点讲解 位 ...

  2. CSS文件中第一行@charset "utf-8";的作用

    使用UTF-8编码唯一的好处是,国外的用户如果使用Windows XP英文版,浏览UTF-8编码的任何网页,无论是中文.还是日文.韩文.阿拉伯文,都可以正常显示,UTF-8是世界通用的语言编码,而如果 ...

  3. C#利用Attribute实现简易AOP介绍 (转载)

    地址:http://dotnet.9sssd.com/csbase/art/638 http://wayfarer.blog.51cto.com/1300239/279913 http://devel ...

  4. canvas 绘圆加边框

    HTML5中canvas元素,绘制圆形需要使用路径,开始时要取得图形上下文,首先使用路径来勾勒图形的轮廓,然后设置颜色,进行绘制. arc(cx,cy,radius,start_angle,end_a ...

  5. CentOS配置FTP(VSFTPD)

    一.vsftp安装篇 # 安装vsftpd yum -y install vsftpd # 启动 service vsftpd start # 开启启动 chkconfig vsftpd on 二.v ...

  6. Tomcat配置虚拟主机后的登录验证码问题

    先描述一下问题现象,在本地测试运行一个java web网站,一切正常.但把网站部署到Linux服务器上后,发现登录出了问题,提示验证码输入不正确.登录时需要输入验证码,而验证码的原值是先存入sessi ...

  7. PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍

    目前的工作是需要对用户的一些数据进行分析,每个用户都有若干条记录,每条记录中有用户的一个位置,是用经度和纬度表示的.还有一个给定的数据库,存储的是一些已知地点以及他们的经纬度,内有43W多条的数据.现 ...

  8. Java输出1~1000之间所有可以被3整除又可以被5整除的数

    主要在于判断是否能被整除,思路是用取余运算符%,取余结果为0就表示能被整除. 代码如下: public class NumDemo { public static void main(String a ...

  9. JS预览图像

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  10. 最新hosts,更新hosts,可用

    点击这里,全选后复制,粘贴到C:\Windows\System32\drivers\etc的hosts里面,把原来的置换了