转载自: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. Check for Data Duplicates on a Grid

    Here is a piece of code to prevent duplicate data on a specific field on a page grid. You can of cou ...

  2. VS2008无法切换到视图设计器

    编写人:CC阿爸 2014-2-17 近来用于干活的笔记本电脑实在太慢了,在领导的安排下,有幸更换了一台配置好的电脑.经过一天的努力,所有之前的开发软件都安装完成了.并且OS从xp升级到win7.SQ ...

  3. Entity Framework 5问题集锦

    ORM框架万万千,一直都使用NHibernate,没用过其他的.最近闲来学习下微软自家的Entity Framework,记录一些我学习过程中遇到的头疼问题.(不断更新中...) 教程:http:// ...

  4. delphi 基础之三 编写和调用dll文件

    delphi 编写和调用dll文件   Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几 ...

  5. java作用域public ,private ,protected 及不写时的区别(转)

    在说明这四个关键字之前,我想就class之间的关系做一个简单的定 义,对于继承自己的class,base class可以认为他们都是自己的子 女,而对于和自己一个目录下的classes,认为都是自己的 ...

  6. 小课堂Week12 Clean Code Part1

    小课堂Week12 Clean Code Part1 今天的主题是函数,让我们看一个函数,找一找其中的"不整洁". 我们也根据这段代码,讨论下对于整洁代码的两个重要原则. publ ...

  7. Sublime Text 2编译python时出错

    [Error 2] The system cannot find the file specified [Finished]   解决方法: 1.环境变量path添加: C:\Python32\Too ...

  8. WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)

    无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...

  9. NOJ1018-深度遍历二叉树

    题目要求很简单,前中后序遍历一棵二叉树.坑爹的是这道题的输入数据和测试数据压根不一样,找了好久原因,去讨论区看见有别人发的测试样例,修改了一下就AC了 测试样例是这个:DEH##FJ##G#CK### ...

  10. Huffman树的编码译码

    上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...