Node.js 错误类型详解:从标准异常到异步处理

作者:终端旅客

时间:2026-10-30

浏览:198

本文系统梳理 Node.js 中的错误分类,涵盖标准 JavaScript 错误、系统错误及自定义错误。重点解析 Error 对象的 message 与 stack 属性,以及系统错误特有的 errno 和 code。针对 Node.js 异步特性,详细阐述基于回调函数的错误处理模式与基于 EventEmitter 的事件监听机制,帮助开发者构建更健壮的异常捕获体系。

文章目录

Node.js 错误类型概述

前言

在 Node.js 应用开发过程中,可能遭遇多种类型的错误。例如,当代码存在语法问题或运行时异常时,会触发 JavaScript 错误;若尝试访问不存在的文件或权限不足的文件,则会触发系统错误。除了这两类由环境或语言本身抛出的错误外,开发者还可以根据业务需求自定义错误类型。

1. 错误分类

Node.js 作为 JavaScript 运行时平台,其应用中产生的所有错误,本质上都是 Error 类的实例,或者是 Error 类的子类实例。

在 Node.js 的应用场景中,主要存在以下四种错误类型:

1、标准 JavaScript 错误,具体包括:

<EvalError> : 当调用 eval() 函数执行失败时抛出

<SyntaxError>: 当使用不符合规范的 JavaScript 语法时抛出

<RangeError> : 当一个数值或参数超出允许的有效范围时抛出

<ReferenceError> : 当代码中引用了未声明或未定义的变量时抛出

<TypeError>: 当传递给函数的参数类型不正确时抛出

<URIError> : 当全局 URI 处理函数被误用时抛出

2、系统错误,这类错误由底层操作系统触发,例如尝试打开不存在的文件,或试图通过已关闭的 Socket 发送数据等情况。

3、自定义错误,这类错误由应用代码中的开发者根据特定业务逻辑指定触发。

4、断言错误,当代码执行违反了合法的逻辑假设时,由 Node.js 的 assert 模块触发此类错误。

JavaScript 错误与系统错误详解

2. JavaScript 错误与系统错误

2.1 JavaScript 错误及自定义错误

标准 JavaScript 错误由 JavaScript 语言规范提供,主要用于表示语法错误或 API 使用不当。所有的错误对象均为 Error 类的实例,而标准的 JavaScript 错误会在错误发生时由语言引擎自动构建。

在创建自定义错误时,只需使用构造函数创建其实例即可:


> throw new Error('出错了,这是错误信息');
Error: 出错了,这是错误信息
  at repl:1:7
  at REPLServer.defaultEval (repl.js:248:27)
  at bound (domain.js:280:14)
  at REPLServer.runBound [as eval] (domain.js:293:12)
  at REPLServer.<anonymous> (repl.js:412:12)
  at emitOne (events.js:82:20)
  at REPLServer.emit (events.js:169:7)
  at REPLServer.Interface._onLine (readline.js:210:10)
  at REPLServer.Interface._line (readline.js:549:8)
  at REPLServer.Interface._ttyWrite (readline.js:826:14)

如上所示,我们定义了一个错误,并使用 throw 关键字将其抛出。在该错误对象中,包含了错误信息 message 和错误的堆栈信息 stack。在捕获异常后,可以通过以下两个属性来访问这些信息:

1、error.message - 获取错误信息

2、error.stack - 获取错误堆栈追踪信息

除了 Error 实例自带的属性外,还可以为错误对象添加自定义属性。例如,可以自定义一个表示业务状态的属性 status:


var error = new Error('您访问的页面不存在');
error.status = 404;

2.2 系统错误

系统错误是对 JavaScript 标准错误 Error 对象的扩展,用于表示程序可以处理的操作层面的错误,这些信息均在系统级别生成。系统错误实例除了包含 Error 实例中的标准属性外,还包含以下特有属性:

1、error.syscall - 一个字符串,表示失败的系统调用名称

2、error.errno - 一个整数,表示具体的错误码

3、error.code - 表示错误字符串,通常以大写英文字母 E 开头

Node.js 异步异常捕获机制

3. 异常捕获

Node.js 采用事件驱动和异步编程机制,这意味着普通的 try / catch 语句无法捕获异步处理过程中发生的错误。针对这一特性,我们可以使用以下两种方式来进行错误的捕获或传递:

Node.js 式回调函数中的异常捕获

Node.js 提供了大量异步 API,这些 API 通过回调函数 callback 进行后续处理。如果操作发生错误,通常会在 callback 函数的第一个参数中包含一个 Error 对象;如果操作成功未发生错误,该参数将是 null。示例如下:


const fs = require('fs');
fs.readFile('一个不存在的文件', (err, data) => {
 if (err) {
  console.error('读取文件错误', err);
  return;
 }
 // 其它处理
});

基于事件的错误处理

如果操作对象是一个 EventEmitter,可以通过监听对象 的'error' 事件来捕获并处理错误:


const net = require('net');
const connection = net.connect('localhost');

// 为stream添加一个 'error' 事件处理器:
connection.on('error', (err) => {
 // 如果连接被服务器重置或连接不到指定的服务器
 // 或其它连接错误时,错误会被传递到这里
 console.error(err);
});

connection.pipe(process.stdout);

总结

以上就是关于 Node.js 中常见错误类型的总结。深入理解 Node.js 的错误分类机制,有助于开发者更有效地进行错误处理和异常捕获。希望本文的内容能对大家的开发工作有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章