zoukankan      html  css  js  c++  java
  • 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. 发送给服务器或从服务器接收到的数据有误
  • 相关阅读:
    我开博客了,啦啦啦.
    cf593div2
    Comet OJ
    cf591div2abc
    cfround586ac
    cf589div2
    cf573div2
    Codeforces Round #569 (Div. 2)
    uva11729 水题
    luogu1984 [SDOI2008] 烧水问题
  • 原文地址:https://www.cnblogs.com/wangdan0915/p/8275328.html
Copyright © 2011-2022 走看看