使用 assert.doesNotReject 时出现 UnhandledPromiseRejectionWarning

Posted

技术标签:

【中文标题】使用 assert.doesNotReject 时出现 UnhandledPromiseRejectionWarning【英文标题】:UnhandledPromiseRejectionWarning while using assert.doesNotReject 【发布时间】:2021-08-05 23:50:13 【问题描述】:
const assert = require('assert');

main = () => 
    try 
        const toTest = async () => 
            return Promise.reject('ERROR'); // or throw 'Error';
        
        assert.doesNotReject(toTest, TypeError);
     catch (e) 
        console.log(e);
    


main();

复制到文件后运行。它提示出来

(node:3056) UnhandledPromiseRejectionWarning: ERROR
(Use `node --trace-warnings ...` to show where the warning was created)
(node:3056) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:3056) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

它只是给出警告。有任何解决这个问题的方法吗?谢谢

【问题讨论】:

【参考方案1】:

这是因为从 Node v7 开始,如果您不处理被拒绝的承诺,您将收到 UnhandledPromiseRejectionWarning 警告。 预计您使用.catch(...) 处理所有承诺拒绝,或者如果您使用async/await,则使用try...catch 块处理它。 这是为了确保您不会忽略代码中发生的任何错误,在未来的 Node 版本中,此警告实际上是一个错误。

您的代码发出此警告是因为 toTest 正在返回一个 Promise 拒绝,但它没有得到处理。 当您调用 assert.doesNotReject(toTest, TypeError); 时,它会等待 toTest 承诺并检查承诺是否未被拒绝。 由于等待的承诺返回一个拒绝,断言将捕获它并再次拒绝它,并且由于拒绝的承诺没有被处理,它会给出一个警告说UnhandledPromiseRejectionWarning

使用 assert.doesNotReject() 实际上没有用,因为捕获拒绝然后再次拒绝几乎没有什么好处。

来源:https://nodejs.org/api/assert.html#assert_assert_doesnotreject_asyncfn_error_message

【讨论】:

toTest() 返回一个拒绝并且不被处理,但是 assert.doesNotReject() 由于测试目的应该提供一个被拒绝的承诺 那是因为assert.doesNotReject 捕捉到拒绝并再次拒绝它。让我用这些信息更新答案【参考方案2】:

我发现 assert.doesNotReject 返回一个承诺 所以不是'assert.doesNotReject(...)',它应该是'await assert.doesNotReject(...)'

【讨论】:

以上是关于使用 assert.doesNotReject 时出现 UnhandledPromiseRejectionWarning的主要内容,如果未能解决你的问题,请参考以下文章

使用 php artisan migrate 时,迁移时更改表名,使用 tinker 保存对象时出错

使用前台服务时允许“使用应用程序时”而不是“始终允许”是不是可以?

为啥在使用自适应查询执行时要使用广播时火花洗牌

使用自定义效果时缺少网格颜色,但使用 BasicEffect 时没有

使用google可视化api时,使用dashboard时如何使用getChartLayoutInterface()

使用PUTTY+xming时出错