从异步函数传播异常的正确方法是啥? [复制]

Posted

技术标签:

【中文标题】从异步函数传播异常的正确方法是啥? [复制]【英文标题】:What is the correct way to propagate an exception from async function? [duplicate]从异步函数传播异常的正确方法是什么? [复制] 【发布时间】:2018-07-19 02:24:07 【问题描述】:

我有一个失败的异步函数:

async function main() 
    // fails
    throw 'some error';


main();

传播此异常以结束程序执行的正确方法是什么?

这是:

main().catch(err =>  console.log(err); process.exit(1); );

正确的方法还是有更好的模式?

【问题讨论】:

我希望它作为一个未处理的异常来停止程序执行。好像main() 不是异步的并且从中抛出了异常。 什么都不做会产生同样的结果,不是吗? 在这种情况下,它会打印一条警告,指出不推荐使用未处理的承诺拒绝,并且程序以代码 0 退出(成功) 那么您从未处理过拒绝,这就是警告。您很可能还有一些其他异步功能没有返回/等待。 其实这个函数返回一个promise,你可以在调用函数中处理它。如果你想在 main 中记录一些东西或产生一种新类型的异常,你可以抛出那个。 【参考方案1】:

有一个更好的方法: 您可以像这样收听“unhandledRejection”事件:

process.on('unhandledRejection', error => 
     console.log('unhandledRejection', error) //if you want to log the error
     process.exit(1);
);

这样做,您不必捕获所有可能抛出的异步函数。如果 catch 函数出现错误,你会自救。

这将删除不需要的警告。

【讨论】:

以上是关于从异步函数传播异常的正确方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中重新引发异常的正确方法是啥? [复制]

使用异步方法等待 Task.Run 不会在正确的线程上引发异常

为对象指针实现复制构造函数和运算符的正确方法是啥

在深度全连接神经网络中进行二元分类的反向传播的正确方法是啥

在 useEffect 挂钩中取消所有异步/等待任务以防止反应中的内存泄漏的正确方法是啥?

在 HTML 属性中调用带有字符串参数的函数的正确语法是啥? [复制]