我正在使用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")
。