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);   // 传递异常对象到错误处理
}
//控制输出(未报错): 月份超边界! 参数错误
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352