You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何os.constants.errno值为正,而util.getSystemErrorName需负错误号?

Node.js错误码符号规范与设计疑问解答

一、标准规范

负整数错误码是Node.js错误处理流程中的标准规范:

  • Node.js错误对象的error.errno属性为负数,对应libuv定义的错误码;
  • util.getSystemErrorMap和util.getSystemErrorName仅支持负整数错误码,传入正整数会抛出范围错误。

而os.constants.errno中存储的正整数,是直接对应操作系统原生的错误码值(例如Unix/Linux系统的errno本身就是正数)。

代码示例验证

os.constants.errno的结构(值均为正数):

{
  E2BIG: 7,
  EACCES: 13,
  EADDRINUSE: 48,
  EADDRNOTAVAIL: 49,
  EAFNOSUPPORT: 47,
  EAGAIN: 35,
  EALREADY: 37,
  EBADF: 9,
  EBADMSG: 94,
  // ...
}

传入正整数错误码调用util.getSystemErrorName会报错:

> util.getSystemErrorName(os.constants.errno.E2BIG)
Uncaught:
RangeError [ERR_OUT_OF_RANGE]: The value of "err" is out of range. It must be a negative integer. Received 7
    at Object.getSystemErrorName (node:util:343:11) {
  code: 'ERR_OUT_OF_RANGE'
}

传入负整数才能正常获取错误名称:

> util.getSystemErrorName(-os.constants.errno.E2BIG)
'E2BIG'

根据Node.js错误对象文档:

error.errno

  • <number>
    error.errno属性是一个负数,对应libuv错误处理中定义的错误码。
    在Windows系统中,系统提供的错误号会被libuv规范化。
    要获取错误码的字符串表示,请使用util.getSystemErrorName(error.errno)。

二、不一致设计的目的

  1. 兼容底层系统规范:os.constants.errno直接暴露操作系统原生的正整数错误码,保持和系统API的一致性,方便需要直接对接系统底层(比如编写C/C++扩展、执行系统命令)的开发者,能直接匹配系统返回的错误码值。
  2. 区分错误体系边界:libuv(Node.js底层跨平台IO库)采用负整数标识错误,以此区分系统调用返回的正整数状态码(系统调用通常成功返回0,失败返回正errno),避免开发者混淆系统原生错误和Node.js封装后的错误。
  3. 实现跨平台统一:不同操作系统的错误码体系差异极大(比如Windows和Unix的错误码数值完全不同),libuv对这些系统错误码做了规范化处理,统一用负整数对外暴露,让开发者在跨平台开发时无需关注不同系统的错误码差异,只需处理统一的错误标识即可。

内容的提问来源于stack exchange,提问作者kpozin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:07:14