我如何从asyncio函数传播异常?



我正在使用asyncio,并且我注意到异常不会在async函数中引发。

我已经创建了一个我所面临的问题的示例,其中我的async函数看起来像:

async def async_fun(foo):
try:
get_foo = await some_thing_async(bar)
except Exception as E:
raise E  # Does not raise exception :( 

我收集和运行,像:

async def main():
await asyncio.gather(async_fun("baz"), return_exceptions=True)

asyncio.run(main())

如何从async_fun传播异常?如果发生异常,我希望能够引发异常。如有需要,我们乐意提供进一步的信息。

return_exceptions=True显式地告诉asyncio.gather()返回可等待对象引发的异常,而不是传播它们,这是默认行为。由于不检查asyncio.gather()的返回值,因此无法注意到异常。

要解决这个问题,只需从asyncio.gather的调用中删除return_exceptions=True:

async def main():
await asyncio.gather(async_fun("baz"))

还要注意,如果您只等待一个函数,则asyncio.gather是不必要的,因此上面的代码可以更简短地写成await async_fun("baz")

最新更新