如何故意让Promise失败?测试try/catch错误捕获逻辑的方法
如何在async函数的条件分支中抛出错误到catch块?
你之前习惯跳过测试直接假设代码正常运行,现在想故意触发错误来验证catch逻辑,其实在if(!cv)的分支里,只需要主动抛出错误就能让catch块捕获到,另外我还发现你代码里有个容易忽略的小问题,一起帮你修正:
核心解决方案:主动抛出Error对象
在async函数中,任何throw语句都会被转化为rejected状态的Promise,刚好能被外层的try/catch捕获。你只需要在if(!cv)的分支里添加throw new Error()即可:
修正后的完整代码
exports.submitJob = async (req, res, next) => { const { cv } = req.body const userId = req.user._id try { if(!cv) { // 直接抛出错误,会被catch块捕获 throw new Error('CV参数不能为空') } // 注意:这里要加await,否则save()的异步错误不会被当前try/catch捕获 const save_submission = await new Submission({ userId, cv }).save() // 可以在这里添加成功后的响应,比如: // res.json({ status: 1, data: save_submission }) } catch(e) { res.json({ status: 0, error: e.message }) } // 注意:如果在try/catch里已经用res.json返回响应,next()可能会导致重复响应,建议根据情况调整 // next() }
关键细节说明
- 主动抛错:
throw new Error('自定义错误信息')会触发try/catch的catch分支,你可以自定义错误信息,方便调试和返回给前端。 - await异步操作:原代码里
new Submission(...).save()是异步方法,返回Promise,但你没有加await,这会导致save过程中的错误无法被当前的try/catch捕获,必须加上await才能让异步错误进入catch块。 - 关于next():如果在catch里已经通过
res.json返回了响应,再调用next()可能会导致Express尝试再次发送响应,引发错误,建议根据你的业务逻辑决定是否保留next()。
内容的提问来源于stack exchange,提问作者Hoknimo
相关产品推荐
相关产品推荐

