美文网首页
JavaScript 错误(Error)及处理错误

JavaScript 错误(Error)及处理错误

作者: 稳5225 | 来源:发表于2019-03-01 17:39 被阅读0次
    一、概述

    程序的非正常运行状态被称为“异常”或“错误”,解释器会为每个错误情形创建并抛出一个Error对象,其中包含错误的描述信息。

    ECMAScript 定义了六种类型的错误:

    ReferenceError :找不到对象时
    TypeError :错误的使用了类型或对象的方法时
    RangeError :使用内置对象的方法时,参数超范围
    SyntaxError :语法写错了
    EvalError :错误的使用了Eval
    URIError :URI错误

    除此之外,还可以使用Error构造方法创建自定义的Error对象,并使用throw语句抛出该对象。

    二、创建错误
    //创建一个错误
    var err1 = Error("a is undefined!");
    var err2 = new Error("a is undefined!");
    
    console.log(typeof err1); //object
    console.log(typeof err2); //object
    console.log(err1);        //输出字符串:'Error: a is undefined!'  at test.html:21
    console.log(err2);        //输出字符串:'Error: a is undefined!'  at test.html:21
    
    三、抛出错误

    throw语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。如果调用者函数中没有catch块,程序将会终止。

    1.抛出了一个值为字符串的异常

    throw "Error";              //控制台报错: Uncaught Error
    

    2.抛出了一个值为整数13的异常

    throw 13;                    //控制台报错: Uncaught 13
    

    3.抛出了一个值为true的异常

    throw true;                 //控制台报错: Uncaught true 
    

    4.抛出了一个错误对象

    throw Error('abc');         //控制台报错: Uncaught Error: abc 
    throw new Error('abc');     //控制台报错: Uncaught Error: abc 
    

    5.应用举例:提示函数调用中的错误

    function sum(...number){
      var isNum = number.every( v => !isNaN(v));
      if(isNum){
        return eval(number.join("+"));        //数组求和
      }else{
        throw new Error("参数必须是数字或数字字符串!");  
      }
    }
    
    console.log(sum(1,2,3));     //6
    console.log(sum(1,2,'3'));   //6
    console.log(sum(1,2,'a3'));  //报错! Error: 参数必须是数字或数字字符串!
    
    四、错误处理

    try{
    \color{#EEF0F4}{--}程序代码
    }catch(error){
    \color{#EEF0F4}{--}如果上面的 程序代码 发生错误将会执行这里的代码,必传参数 error 是程序错误的信息对象
    }finally{
    \color{#EEF0F4}{--}无论是否出错,肯定都要执行的代码(finally可以省略)
    }
    使用注意点:
    1.会降低代码效率,使用try包裹的代码,即使不出错,效率也比不用try包裹的代码低。
    2.在try中,尽量少的包含可能出错的代码。
    3.无法提前预知错误类型的错误,必须用try catch捕获。

    var txt = "";
    try{
      alertt("Welcome guest!");             //将alert()写错            
    }catch(err){
      txt += "错误:" + err.message + "\n";    //err.message错误信息
      txt += "程序继续执行了!";
      console.log(txt)
    }
    console.log(123);
    
    /*控制台输出(未报错):
    错误:alertt is not defined
    程序继续执行了!
    123
    */
    

    注:catch(error) 中,error 是必传参数否则会报错!

    重新抛出异常

    try {
       throw 60;        // 抛出一个数值异常
    } catch (e) {
       if (e <= 50) {
          // 异常在 1-50 之间时,直接处理
       } else {
          throw e;    // 异常无法处理,重新抛出
       }
    }
    //控制台报错: Uncaught 60
    
    try {
      throw {a:1, b:2};        // 抛出一个对象异常
    } catch (err) {
      throw err.b;             // 重新抛出
    }
    //控制台报错: Uncaught 2
    
    五、使用实例

    输入数值获取对应的月份的简写。

    function ParameterError(message) {
       this.message = message;
       this.name = "参数错误";
    }
    function getMonthName(mo) {
       mo = mo-1;                // 调整月份数字到数组索引 (1=Jan, 12=Dec)
       var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
       if (months[mo] !== undefined) {
          return months[mo];
       } else {
          throw new ParameterError("月份超边界!");
       }
    }
    
    try {
       var myMonth = 15;                 // 15 超出边界并引发异常
       var monthName = getMonthName(myMonth);
    } catch (e) {
       var monthName = "unknown";
       console.log(e.message, e.name);   // 传递异常对象到错误处理
    }
    //控制输出(未报错): 月份超边界! 参数错误
    

    相关文章

      网友评论

          本文标题:JavaScript 错误(Error)及处理错误

          本文链接:https://www.haomeiwen.com/subject/pvhjuqtx.html