Node.js中catch捕获错误时err.code总是undefined,如何正确获取错误码?
核心原因
你测试的两个报错都属于ECMAScript标准定义的内置通用错误,这类错误的标准属性只有name、message、stack,没有规范code字段,因此打印err.code会返回undefined。code是Node.js为内置模块操作错误、系统运行时错误额外添加的专属属性,仅在特定场景下的错误实例中存在。
解决方案
- 方案1:使用标准
err.name区分错误类型
你给出的测试代码可以修改为读取name属性做错误分类,完全可以满足通用场景需求:
try { const f = 4; f = 9; } catch (err) { console.log(err.name); // 输出 TypeError console.log(err.message); } try { d = 12; } catch (err) { console.log(err.name); // 输出 ReferenceError console.log(err.message); }
常见的内置错误name包括TypeError、ReferenceError、RangeError、SyntaxError等,覆盖了绝大多数通用语法、逻辑错误场景。
- 方案2:自定义错误时主动添加code属性
如果是业务逻辑中主动抛出的错误,你可以手动给Error实例添加code字段,方便后续捕获时做定向处理:
try { const user = {} if (!user.id) { const err = new Error('用户id缺失') err.code = 'USER_ID_EMPTY' throw err } } catch (err) { console.log(err.code) // 输出 USER_ID_EMPTY console.log(err.message) }
- 方案3:Node.js内置模块错误直接读取code
当你调用Node.js的fs、http、child_process等内置模块触发错误时,返回的错误实例默认携带code属性,不需要额外处理就能直接读取:
const fs = require('fs') try { fs.readFileSync('./不存在的文件.txt') } catch (err) { console.log(err.code) // 输出 ENOENT console.log(err.message) }
内容的提问来源于stack exchange,提问作者daniel zarbiv
相关产品推荐
相关产品推荐

