1. Error 类型构造函数
Error
:通用类型,所有错误的父类型EvalError
(评估错误):与全局变量 eval()
有关的类型RangeError
(范围错误):数值变量或参数超出其有效范围ReferenceError
(参考错误):无效引用SyntaxError
(语法错误):eval()
在解析代码的过程中发生的语法错误TypeError
(类型错误):值的类型非预期类型时发生的错误URIError
(URL 错误):给 encodeURL()
或 decodeURL()
传递的参数无效AggregateError
:一个错误对象,包含多个错误InternalError
:出现在 JavaScript
引擎内部的错误
const fn1 = () => {
fn1();
};
fn1();
console.log(a);
eval("a++b");
let a = null;
console.log(a.b);
2. error 对象
- 当代码运行时的发生错误,会创建新的 Error 对象,并将其抛出
- 手动创建 error 对象
可以使用 new 关键字,也可以不使用,创建的 error 对象都是一样的
new Error类型构造函数(message)
或Error类型构造函数(message)
- Error 构造函数的参数
参数一 message :可选,一般是描述错误信息的字符串
参数一 cause :可选,一般是描述错误具体信息的字符串,
只有在构造函数中定义了 cause 属性,才有该属性,否则实例没有 cause 属性
const err = new Error("人为抛错");
const err = new EvalError("评估错误");
const err = new RangeError("范围错误");
3. error 对象的属性和方法
-
error 对象的属性
- name:错误的类型名字
- message:错误信息描述
- cause:错误信息的具体描述,需要在构造函数中定义
- stack:错误的堆栈轨迹,用于追踪错误来源
-
error 对象的方法
- toString():将 error 对象转化为字符串
error.toString()
const err = new Error("抛错", { cause: "人为报错" });
console.log("err对象:", err);
console.log("err.name:", err.name);
console.log("err.message:", err.message);
console.log("err.cause:", err.cause);
console.log("err.stack:", err.stack);
console.log("将error对象转化为字符串:", err.toString());
4. 主动抛错
throw
语句用于抛出一个用户自定义的错误。- 当程序执行
throw
语句时,将会主动触发 js 编译报错,阻塞后续代码运行。 throw
语法:throw expression
;(expression:异常的值)
throw "这是一个人为抛错";
throw new Error("这是一个人为抛错");
5. try...catch...finally...
语句
- 可以有多个 try 块
- 可以有多个 catch 块
- 至少要有一个 catch 块或 finally 块
- 可以 catch 块、finally 块兼有
- 语法:
try {
} catch (error) {
} finally {
}
6. 无条件的 catch 语句
- 当使用的 catch 语句未设置条件时,捕获到任何异常,都会执行 catch 块内的代码
- catch 语句可以清理 try 语句中的报错代码阻塞。catch 语句会捕获 try 语句中的所有报错信息,并将其全部清理,从而跳过报错代码,让代码继续向后运行
try {
console.log("语法错误:未定义的变量", a);
} catch (e) {
console.log(`错误信息:${e}`);
}
console.log("代码没有阻塞");
try {
console.log("语法错误:未定义的变量", a);
} finally {
console.log(`finally`);
}
console.log("因代码报错阻塞,无法运行");
7. 条件 catch 语句
- 可以给 catch 语句设置捕获满足条件的错误,只有捕获到满足要求的错误时,才会执行对应的 catch 语句内的代码
- 可以设置多个不同条件的 catch 语句,分别执行捕获到不同错误时的代码
- 既有无条件 catch 语句和条件 catch 语句时,无条件 catch 语句需要放到最后。如果无条件 catch 语句放首位,会将所有错误截获,导致后面的 catch 语句无法捕获到错误
- 参数 error:catch 语句捕获到的错误信息
try {
throw TypeError("类型错误");
throw RangeError("范围错误");
throw EvalError("评估错误");
} catch (e) {
if (e instanceof TypeError) {
console.error(e);
} else if (e instanceof RangeError) {
console.error(e);
} else if (e instanceof RangeError) {
console.error(e);
}
}