转载自: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. MongoDb Replica Set中使用的地址

    Unable to connect to a member of the replica set matching the read preference Primary 今天尝试使用MongoDB ...

  2. js获取数组中的最大值最小值

    遍历方法: var tmp = [1,12,8,5]; var max = tmp[0]; for(var i=1;i<tmp.length;i++){ if(max<tmp[i])max ...

  3. 添加TextView隐藏进度条的方法

    在TextView中添加 android:scrollbars="vertical" android:singleLine="false" 在Activity代 ...

  4. 开源web终端ssh解决方案-gateone简介

    好久都没来写博客,最近忙啥去了呢? 一是忙于saltstack的二次开发,二是云计算的学习研究中,所以就一直没写东西,今天给大家介绍个工具. 1. 首先来说一下为什么要 web ssh? 许多人不是说 ...

  5. DevExpress 中 在做全选的全消功能的时候 加快效率

    在做 DevExpress 中对增加的选择 Check列 控制全选的全消时通过以下代码红色字代码效率会有明显的提升: private void CheckedRow() { try { splashS ...

  6. RAC本地数据文件迁移至ASM的方法--非归档模式

    系统环境:rhel6.2_x64+Oracle RAC11g 操作过程: 1.非归档模式 SQL> archive log list; Database log mode No Archive ...

  7. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  8. Android无法连接adb的解决方法

    今天在折腾乐蛙时发现无法链接ADB了,但是手机却显示USB调试模式! 然后想起了大蛋曾经告诉我CM的解决方法,于是你懂得,俺差点就把菊花给卖了呢(/Д`)~゚。 adb shell rm -r /da ...

  9. Android Studio添加aar包依赖

    1.将aar包考入需要依赖的模块的libs目录下 2.在需要依赖的模块的build.gradle中添加如下内容: dependencies { compile(name:'aar包名不带扩展名', e ...

  10. Microsoft Visual Studio 语言切换

    事情的起因是需要安装本地的中文帮助,OS以及Viusal Studio都安装的英语版本. 其实需要安装的安装Viusal Studio的中文语言包即可. 通过工具选项可以达到以下的对话框 可以通过下载 ...