实际开发中经常会遇到由于局部代码出错而导致整个项目的崩溃,因此在开发过程中有意识地捕获异常并抛出错误是极其有必要的。
下面记录一下JS中的一些错误处理机制。
1.Error对象
Error是Javascript的一个内置对象,可以让我们手动创建错误对象并提供错误信息。
// 创建Error对象
const error = new Error('perosnal Error');
// Error对象name =>Error
console.log(error.name);
// Error对象错误信息 => 'perosnal Error'
console.log(error.message);
// Error错误执行栈
console.log(error.stack);
但是只创建Error对象,程序并不会抛出错误/终止执行。想要将创建的错误对象抛出,就需要用到throw语句。
2.throw
throw是JS异常处理的核心语句,使用它就可以将我们生成的错误信息抛出并终止程序运行。
throw
语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw
之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch
块。如果调用者函数中没有catch
块,程序将会终止。
throw语句可以抛出任意类型的错误。
throw "Error2"; // 抛出了一个值为字符串的异常
throw 42; // 抛出了一个值为整数42的异常
throw true; // 抛出了一个值为true的异常
搭配try...catch语句可以可控制地进行异常捕获处理。例如在发送网络请求等存在不确定因素时,就可以使用try...catch来保证程序的健壮性。
try {
if (1 < 2) {
throw 'an error';
}
} catch (error) {
// throw出来的异常,会在下面的第一个catch中捕获到,如此不会尽管发生了错误,也并不会终止整个程序执行
console.log(error);
}
3.程序报错机制
1.JS运行时自带的报错功能(错误检测机制)
语法错误,例如:使用未定义变量,方法。
2.由外部库提供的报错机制
引用的外部库没有按照规范使用时,其内部报错,例如React中渲染元素时children为对象类型<span>{obj}</span>,此时React程序就会报错。
3.手动抛出异常
代码中手动:throw 'Error';
4.try...catch
详见throw语句说明。它的作用就是允许程序出错,并抛出错误,之后继续执行try catch之后的代码。
注意:正常情况下 try...catch只能捕获同步代码中的错误,但是使用async和await就可以捕获到异步行为中的错误。
const fs = require('fs');
// 一个读取文件内容的方法
// log顺序 'MyError' => '异步代码后面的内容'
const readFile = async () => {
try {
await new Promise((resolve, reject) => {
fs.readFile('错误url', (err, data) => {
if (err) reject(err);
console.log(data);
})
})
} catch (error) {
console.log('MyError', error);
}
console.log('异步代码后面的内容');
}
readFile();