JavaScript 错误(Error)及处理错误

一、概述

程序的非正常运行状态被称为“异常”或“错误”,解释器会为每个错误情形创建并抛出一个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);   // 传递异常对象到错误处理
}
//控制输出(未报错): 月份超边界! 参数错误
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值