故意在承诺中抛出错误?

Posted

技术标签:

【中文标题】故意在承诺中抛出错误?【英文标题】:purposely throw error in a promise? 【发布时间】:2018-10-29 12:09:05 【问题描述】:

如何故意让承诺失败?有时我只是跳过测试并假设一切都很好,但我想故意做出失败的承诺,以便我的捕获起作用。

exports.submitJob = async (req, res, next) => 
    const  cv  = req.body
    const userId = req.user._id

    try 

      if(!cv) 
        //how to pass error to catch block?
      
      const save_submission = new Submission(
        userId,
        cv
      ).save()


     catch(e => 
      res.json(
        status: 0,
        error: e
      )
    )

    next()

【问题讨论】:

您是否尝试抛出错误? 【参考方案1】:

您可以throw new Error('<your string here>');:

请注意,catch 不能与 function 语法一起使用 - 正确的语法是 catch (e) /* block that uses e */

const submitJobWhichWillFail = async (req, res, next) => 
  const cv = null;
  try 
    if (!cv) 
      throw new Error('cv must not be falsey!');
    
    const save_submission = new Submission(
      userId,
      cv
    ).save()


   catch (e) 
    console.log('res.json with error ' + e);
  

submitJobWhichWillFail();

【讨论】:

为什么throw('something is wrong') 也有效?我试过没有new,只是throw Error('something is wrong')也工作了。 参见this answer 和它下面的throw new Error 据说更可靠,尽管现在它可能不那么重要了,因为更多的浏览器都符合标准。【参考方案2】:

使用throw 语句,也许?

if(!cv) throw("cv is absent");

用户定义的异常类型(类似于 Java 或 php 中的常见异常类型)也是可能的并且推荐使用,因为几乎不能通过字符串来区分类型,否则可以轻松检查 typeof 中的异常987654326@ 块。刚刚从 MDN 中学到了,例如。也可以抛出DOMException和Error。

【讨论】:

以上是关于故意在承诺中抛出错误?的主要内容,如果未能解决你的问题,请参考以下文章

不能从异步承诺执行器函数中抛出错误

我如何知道哪些处理程序在 promise 中抛出错误?

如何编写一个期望在 Jasmine 中抛出“错误”的测试?

期望函数在 Jest 中抛出异常

异常被承诺链吞噬

SwiftUI 组嵌套在 VStack 中抛出错误