gpt4 book ai didi

python - asyncio - 从任务中重新引发异常

转载 作者:行者123 更新时间:2023-12-04 08:04:30 26 4
gpt4 key购买 nike

我正在使用 asyncio 进行一些 TCP 通信。我有一个 Receive()功能read()在无限循环中。这使用 asyncio.create_task(Receive()) 作为后台任务运行.
现在,如果连接被对等方关闭,则会引发我在 Receive() 中捕获的异常(或可能是任何其他异常)。功能。但是,我想重新引发该异常,以便外部代码可以决定要做什么(例如重新连接)。
由于在任务中引发了异常,我不知道如何检索它。
我试图创建一个例子来说明我的意思:

import asyncio

async def divide(x):
try:
return 1/x
except Exception as e:
print("Divide inner exception: ", e)
raise # Re-raise so main() can handle it

async def someFn():
asyncio.create_task(divide(0)) # Exception is never retrieved
# await divide(0) # This will raise two exceptions - the original in divide() and in main()

async def main():
try:
await someFn()
# Do other things while someFn() runs
except Exception as e:
print("main exception: ", e)

asyncio.run(main())
我如何在 main() 中获得任务异常?

最佳答案

How do I get the task exception in main()?


您可以利用引发异常的任务完成这一事实,而不是让任务在后台运行,而是实际等待其完成。这就要求创建任务的代码不能保留 create_task()返回的任务对象。并将其返回给调用者或将其存储到一组共享任务中。 (诸如 trio 之类的库甚至不允许盲目生成后台任务,而是要求每个任务都附带一个 nursery 来定义谁处理其异常)。
例如:
async def someFn():
# set up a background task, but also return it to the caller
t = asyncio.create_task(divide(0))
return t

async def other_things():
await asyncio.sleep(1)

async def main():
try:
task = await someFn()
# await both the background task and other things, immediately
# propagating an exception in either
await asyncio.gather(task, other_things())
except Exception as e:
print("main exception: ", e)

关于python - asyncio - 从任务中重新引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66293545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com