javascript中错误处理

由于js本身是动态语言,而且多年来一直没有固定的开发工具,因此人们普遍认为他是一种难于调试的编程语言。尤其是在脚本出错时,浏览器通常会给出类似于“object expected”(缺少对象)这样的消息,没有上下文,让人摸不着头脑,后来便引入了try-catch和throw语句以及一些错误类型,让开发人员能够适当的处理错误。

(1.)try-catch语句

语法:

try{

//可能会导致错误的代码

}catch(error){

//在错误时该如何处理

}

也就是说,我们应该把又可能抛出错误的代码都放在try语句块中,而把那些用于处理错误的语句放在catch块中,如:

try
  {
window.someNonexistentFunction();
  }
catch(error)
  {
alert("an error happened!");
  } 

如果try块中的任何代码发生了错误,就会立即退出代码执行的过程,然后接着执行catch块。此时,catch会接受到一个包含错误消息的对象,然而这个错误消息是必须给他起个名字的。这个对象中包含的实际信息会因浏览器而不同,但是相同的是有一个保存着错误消息的message属性,ECMA-262还规定一个保存错误类型的name属性;当前的所有浏览器都支持这个属性。因此在发生错误时,就可以像下面这样实事求是的显示浏览器给出的信息。

try
  {
window.someNonexistentFunction();
  }
catch(error)
  {
alert(error.message);
  } 

这个message属性是唯一一个能够保证所有浏览器都支持的属性,初次之外,IE,FIREFOX,SAFAIR CHROE以及opera都为对象添加了其余相关信息,IE添加了与message属性完全相同的description属性,还添加了保存着内部错误数量的number属性,FIREFOX添加了filename,linenumber和stack的属性,SAFAIR添加了line(表示行号),sourceid(表示内部错误代码 )和sourceurl属性。当然,在跨越浏览器编程时,最好还是只使用message属性。

(2).finally子句

虽说,try-catch是可选的,但是finally子句一经使用,其代码无论如何都是要执行的,也就是说无论try中的语句无论是错误还是正确,finally子句依旧执行,甚至return语句都不能阻止finally子句的执行。

如下:

try
  {
return  2;
  }
catch(error)
  {
return   1;
  } finally{

return   0;


该函数中,最终返回结果为0,若没有finally则返回2,如果代码中包含finally语句,则无论是try还是catch中的语句都会被忽略,所以,在使用finally子句之前,一定要清楚自己想要代码做什么。

(3).错误类型

在执行代码期间,每种错误都有对应的错误类型。

a. error:是基类型,其他错误类型都是继承于该类型的。

b. evalerror:该类型的错误会在使用eval()函数而发生异常时被抛出,如果没把eval()当成函数调用,则就会抛出错误。

c. rangerror::该类型的错误会在数值超出范围时触发。如:

var item1 = new  array (-20) ;          //会抛出rangerror

var item2 = new arry(Number  Max_value);       //抛出rangerror

d. referenceerror:通常在访问不存在的变量时,就会发生这种错误,如:

var  obj = j;            //抛出Referenceerror错误

e.  syntaxerror :该语法是把js字符传入eval()函数时,就会导致此类错误。如:

eval (" a + b");         // 抛出syntaxerror 错误。

如果语法错误的代码出现在eval()之外,则不太可能使用syntaxerror。

f.  typeerror :类型在js中经常会经常使用,是由于在执行特定于类型的操作时,变量的类型并不符合要求所致。如:

var  0 = new 10;  //抛出typeerror ;

alert (" name" + in  true);      //抛出typeerror ;

  function.prototype.tostring.call("name") ;          //抛出typeerror ;

g . urlerror :在使用encodeurl()或decodeurl(),而url格式不正确时,会导致urlerror错误。

由于encodeurl()其容错性比较高,所以此类错误较少。

(3)抛出错误throw

thorw操作符,是用于随时抛出自定义错误,切必须给throw指定一个值。

在遇到throw时,代码会立即停止执行,仅当有try-catch语句捕获到被抛出的值时,代码才会继续执行。如:

try
  {
  var x=document.getElementById("demo").value;
    if(x=="")        throw "不能为空!";
    if(isNaN(x))    throw "不为数字!";
    if(x>10)        throw "数字过大!";
    if(x<5)         throw "数字太小!";
  }catch(err
or)
  {
    var y=document.getElementById("mess");
    y.innerHTML="错误:"+err
or
+".";
  }

在创建自定义消息时,最常见的错误类型是error,rangerror, referenceerror和  typeerror。另外,利用原生链还可以通过继承error来创建自定义错误类型,此时需要为新创建的错误类型指定name和message属性。如:

functioncustomerror (message ){

this.name = "customerror" ;

this .message = message;

customerror.prototype = new error();

throw  new  customerror( " my message"); 

}

浏览器对待继承自error的自定义错误类型,就像对待其他错误类型一样,如果要捕获自己抛出的错误并且把它与浏览器错误区别对待的话,创建自定义错误时非常有用的。

IE只有在抛出error对象的时候才会显示自定义错误消息。对于其他类型,他都无一例外的显示“ exception  throw  and  not  caught ”(抛出了异常,且未被捕获。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值