js错误处理Try-catch和throw

1、try-catch语句

 

Try{

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

}catch(error){

  //在错误发生时怎么处理

}

例如:

try{

  window.someNonexistentFunction();

}catch(error){

  alert('an error happened');

  //alert(error.message);

}

 

如果try块中的任何代码发横了错误,就会立即退出代码执行过程,然后接着执行catch块。此时,catch块会接收到一个包含错误信息的对象。与在其他语言中不同的是面积是你不想使用这个错误对象,也要给他起个名字。这个对象中包含的实际信息会因浏览器而异,但共同的是有一个保存这错误信息的message属性。

 

1) finally子句

虽然在try-catch语句中是可选的,但finally子句一经使用,其代码无论如何都会执行。换句话说,try语句块中的代码全部正常执行,finally子句会执行。如果因为出错而执行了catch语句块,finally子句照样还会执行。甚至return语句,都不会组织finally子句的执行。来看下面这个函数:

function test(){

  try{

    return 2;

  }catch(error){

    return 1

  }finally{

    return 0;

  }

}

 

由于finally导致return 2;语句被忽略。也就是说这个函数只能返回0.如果把finally子句去掉,这个函数就返回2

注:在使用finally子句之前,一定要非常清楚你想让代码怎么样。

 

2) 合理使用try-catch语句

try-catch语句中发生错误时,浏览器会认为错误已经被处理了,因而不会通过本章前面讨论的机制记录或报告错误。对于那些不要求用户懂技术,也不惜要用于理解错误的web应用程序,这应该说是个理想结果。不过,try-catch能够让我们事先自己的错误处理;

使用try-catch最适合处理那些我们无法控制的错误。假设你在使用一个大型javascript库中的函数,该函数可能会有意无意地抛出一些错误。由于我们不能修改这个库的代码,所以大可将对该函数的调用放在try-catch语句中,万一有什么错误发生,也好恰当地处理它们。

在明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不合适了。

2、抛出错误throw

throw 123456;

throw “hello”;

throw true;

throw {name:’javascript’};

 

以上代码都是有效的,在遇到throw 操作符时,代码会立即挺尸执行。仅当有try-catch语句捕获到被抛出的值时,代码才会继续执行。

例子:

function process(values){

  if(!(values instanceof Array)){

    throw new Error('process():Argument must be an Array');

  }

  values.sorts();

  for(var i=0,len=values.length;i<len;i++){

    if(values[i]>10){

      return values[i];

    }

  }

  return -1;

}

 

浏览器会像处理自己生成的错误一样,来处理这行代码抛出的错误。

 

3、处理错误策略

 

大体上来说,基本类型的值应该使用typeof来检测,而对象的值则应该使用instanceof来检测。

1)通讯错误

Url格式:

http://www.yourdomain.com/?redir=http://www.sometherdomain.com?a=b&c=d

是不对的。会生成一下字符串:

http://www.yourdomain.com/?redir=http:%3A%2Fwww.sometherdomain.com%3Fa%3Db%26%3Dd

 

 

对于查询字符串,应该记住必须使用encodeURIComponent()方法。

function addQueryStringAry(url,name,value){

  if(url.indexOf('?')==-1){

    url+="?";

  }else{

    url+="&";

  }

  url+=encodeURIComponent(name)+"="+encodeURIComponent(value);

  return url;

}

 

可以确保编码正确并避免相关错误。

2)可能的致命错误:

for (var i=0,len=mods.length;i<len;i++){

  mods[i].init();//可能会导致致命错误

}

 

表面上看,这些代码没什么问题;问题在于任何模块的Init()方法如果出错,都会导致数组中后序的所有模块无法再进行初始化。可修改为:

for (var i=0,len=mods.length;i<len;i++){

  try{

    mods[i].init();

  }catch(ex){

//在这里处理错误

logError('nonfatal','Module init failed:'+ex.message);

  }

}

 

以下是几种避免浏览器相应js错误的方法:

 

1) 在可能发生错误的地方使用try-catch语句;

2) 使用window.onerror事件处理程序,这种方式可以接受try-catch不能处理的所有错误。

3) 首先,必须要明确什么是致命错误,什么是非致命错误。

4) 其次,再分析代码,以判断最可能发生的错误,原因主要如下

  1. 类型转换
  2. 未充分检测数据类型
  3. 发送给服务器或从服务器接收到的数据有误
posted @ 2018-01-12 13:46  for_tomorrow  阅读(1072)  评论(0编辑  收藏  举报