CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Node.js 进阶/课时/错误类型与处理
RawBlame
课时目录12 节

Node.js 进阶

  1. 01Node 进阶概览
  2. 02EventEmitter
  3. 03错误类型与处理
  4. 04语义化版本
  5. 05创建与发布包
  6. 06命令行应用
  7. 07Inquirer 与 prompts
  8. 08chokidar 与热重载
  9. 09模板引擎
  10. 10Node 与数据库
  11. 11glob 与文件模式
  12. 12综合练习

错误类型与处理

system/user/assertion errors。

30 分钟

错误类型与处理

Node 把错误分为 系统错误、用户代码错误、断言失败 等类别。CLI 与 npm 包要在 退出码、stderr、Promise rejection 上行为一致——否则脚本进 CI 时难以判断失败原因。

学习目标

  • 区分 system / user / assertion 类错误
  • 在 async 与 EventEmitter 中统一错误传播
  • 衔接 node-errors 与 testing-essentials

错误从哪来

类型典型来源处理倾向
SystemENOENT、网络超时、EACCES记录、重试或向上抛
User非法参数、业务规则拒绝友好 message、退出码 1
Assertionassert()、测试断言开发期暴露,生产慎用
import fs from "node:fs/promises";

try {
  await fs.readFile("missing.txt");
} catch (err) {
  if (err.code === "ENOENT") {
    console.error("文件不存在:", err.path);
    process.exitCode = 1;
  } else {
    throw err; // 未知系统错误继续抛
  }
}

同步、Promise 与 uncaughtException

  • 同步:try/catch
  • Promise:.catch() 或顶层 await + try/catch
  • EventEmitter:'error' 事件(见 nva-events)
process.on("unhandledRejection", (reason) => {
  console.error("Unhandled rejection:", reason);
  process.exitCode = 1;
});

CLI 入口建议在 最外层 捕获 rejection,打印 stderr 后以非零退出——与 nva-cli 的 main() 包装一致。

自定义错误类

export class UserError extends Error {
  constructor(message) {
    super(message);
    this.name = "UserError";
  }
}

export function isUserError(err) {
  return err instanceof UserError;
}

Nest 的 HttpException 是框架层封装(nest-exceptions);包与脚本用 plain Error 子类 即可,便于 test-intro 中断言 。

instanceof

退出码约定

码含义
0成功
1一般失败(用户或业务)
2误用(参数、flag)

避免把 堆栈 直接给用户看;DEBUG=1 时再打印 err.stack。

练习

  • 为「非法 slug」定义 UserError,CLI 捕获后 exit 1
  • 写测试:system 错误 mock 为带 code 的对象(参考 node-test)
  • 对比 Spring @ControllerAdvice 与 CLI stderr 输出职责

小结

系统错误向上抛,用户错误说清楚,脚本用退出码说话。 下一课 semver——发包的版本纪律。

加载本节练习…
← 上一课EventEmitter下一课 →语义化版本