一、Error的类型

Node.js 的 Error 一般分为四种类型:

1、标准的 JavaScript 错误,例如EvalError、SyntaxError、RangeError、ReferenceError、TypeError或URIError。
2、由底层操作系触发的系统错误,例如试图打开不存在的文件、或试图使用已关闭的 socket 发送数据。
3、由应用程序代码触发的用户自定义的错误。
4、AssertionError 错误,当 Node.js 检测到不应该发生的异常逻辑时触发。这类错误通常来自 assert 模块。

「Node学习笔记」Node.js的Error简介及捕获方式实践_捕获方式

二、Error的捕获方式实践

Node.js 有 3 种当应用程序发生错误时的捕获方式。


(1)try…catch

一般用于处理代码中可能出现的错误信息,当错误发生时,JavaScript 会停止执行,并生成一个错误信息。使用 throw 语句来创建自定义消息(抛出异常)。如果将 throw 和 try、catch 一起使用,就可以控制程序输出的错误信息。当异常时,用 try…catch 处理,则 Node.js 进程会立即退出。

// 抛出一个 ReferenceError,因为 z 未定义。
try {
const m = 1;
const n = m + z;
} catch (err) {
// 在这里处理错误。
}

但需要注意的是,如果想在异步方法的回调函数里面抛出错误,不要放在 try … catch 代码块中,因为代码执行顺序的原因,回调函数还没有执行,try…catch 代码已经执行完毕并退出。

try {

setTimeout(function () {
// 抛出一个异常错误,这是因为异步函数执行上下文不同,所以捕获不到。
throw new Error('setTimeout error');
}, 1000);

} catch (err) {
console.log(err);
}


(2)回调函数中的 error 参数

大多数 Node.js 核心 API 所提供的异步方法都遵从错误信息优先的回调模式惯例,这种模式有时也称为 Node.js 式回调。

在这种模式中,一个回调函数首先被作为参数传给异步方法。当该方法完成操作或产生错误时,它会调用回调函数,并将可能存在的 Error 对象作为第一个参数传给回调函数。如果没有错误产生,那么第一个参数为 null 。

const fs = require('fs');


fs.readFile('/f1', (err, data) => {
if(err) {
console.error('出错', err);
return;
}
console.log(data);
});


(3)process.on(‘uncaughtException’)事件监听

当系统发生异常,且没有被 try…catch 捕获时,会触发‘uncaughtException’事件。该方法适用于全局的异常捕获,来避免 Node.js 进程的崩溃,但该方法仅仅用于异常捕获,无法做成相应的异常处理,因为无法定位到发生异常的上下文。

process.on('uncaughtException', (err) => {
console.log(err);
});


setTimeout(() => {
console.log('这里仍然会运行');
}, 500);


// 故意引起异常,但不要捕获它。
errorFunc();
console.log('这里不会运行');


三、总结

异常错误在程序中是无法避免的,重要的是在发生错误时,我们应该如何处理错误,来保证程序的顺利执行。


下期给大家分享更多实战中的点滴,如果大家对此感兴趣,欢迎各位关注、留言,大家的支持就是我的动力!