一、概述
程序的非正常运行状态被称为“异常”或“错误”,解释器会为每个错误情形创建并抛出一个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{
程序代码
}catch(error){
如果上面的 程序代码 发生错误将会执行这里的代码,必传参数 error 是程序错误的信息对象
}finally{
无论是否出错,肯定都要执行的代码(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); // 传递异常对象到错误处理
}
//控制输出(未报错): 月份超边界! 参数错误
网友评论