从异步函数传播异常的正确方法是啥? [复制]
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 函数出现错误,你会自救。
这将删除不需要的警告。
【讨论】:
以上是关于从异步函数传播异常的正确方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用异步方法等待 Task.Run 不会在正确的线程上引发异常