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

如何故意让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:37:23