转载自: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. Django搭建及源码分析(一)

    一.关于Django以下两个站点,在使用方面有详细说明. http://www.nowamagic.net/academy/part/13/286 http://www.w3cschool.cc/dj ...

  2. Silverlight DataGrid数据行背景颜色控制

    sdk:DataGrid数据绑定后,部分特殊的行需要用不同的背景颜色来显示.(注册DataGrid的LoadingRow事件) private void radGridView_LoadingRow( ...

  3. Java实现计算20的阶乘

    循环从1乘到20,要注意的就是结果可能会很大,长度超出int类型的范围,所以定义乘积的时候用long. 代码如下: public class Practice3 { public static voi ...

  4. 学习simple.data之进阶篇

    一.结果排序 -OrderBy(升序) -OrderByDescending(降序) db.Product.All().OrderByFactoryName(); db.Product.All().O ...

  5. C#的编译

    Windows上的编译 1:先将C:\Windows\Microsoft.NET\Framework\v3.5配置到系统环境变量的path里. 2:写C#代码 demo1.txt using Syst ...

  6. xm 命令详解

    xm 命令详解 xm addlabel label dom configfile [policy] xm addlabel label res resource [policy] 增加了名称为labe ...

  7. Linux下自带的regex

    Linux下可直接用regex.h来支持正则表达式. Android同样也有该头文件,可认为Android也是支持的. #include <sys/types.h> #include &l ...

  8. 算法系列3《SHA》

    SHA是一种数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用.该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小 ...

  9. SQL*PLUS下使用AUTOTRACE、sql顾问、实时sql监控

    高级SQL优化(三) 常用优化工具 ——<12年资深DBA教你Oracle开发与优化—— 高级SQL优化(一) ——<12年资深DBA教你Oracle开发与优化——性能优化部分 1 aut ...

  10. Android之Activity的四种启动模式

    当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中.Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activ ...