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

