gpt4 book ai didi

python-3.x - 协程的 Python 回溯

转载 作者:行者123 更新时间:2023-12-03 19:30:32 25 4
gpt4 key购买 nike

假设我有以下代码:

from types import coroutine

@coroutine
def stop():
yield 1

async def test2():
await stop()

async def test1():
await test2()
await test2() # Here
await test2()

coro = test1()
coro.send(None)
coro.send(None)

如何获得当前协程状态的回溯(回溯对象),即标有注释的行,而不会人为地抛出不需要的异常?

最佳答案

使用 traceback.print_stack()将为您提供与抛出的异常完全相同的回溯:

async def test1():
await test2()

traceback.print_stack()
# raise Exception()

await test2() # Here
await test2()

您可以使用 traceback.extract_stack()如果您想接收对象而不是打印。

但是请注意,您正在做一些奇怪的事情。 asyncio协程不应该运行使用它的生成器的自然功能,如 .send() .

asyncio您等待协程并使用事件循环运行顶级协程。请在 documentation 中查看它是如何完成的.

我写了另一个小例子,展示了当你使用 asyncio 时如何在内部协程中打印 start常规方式:
import asyncio
import traceback


async def test3():
traceback.print_stack()


async def test2():
await test3()


async def test1():
await test2()


asyncio.run(test1())

你会看到的:
  File "C:\main.py", line 24, in <module>
asyncio.run(test1())

# inner event loop stack here

File "C:\main.py", line 21, in test1
await test2()
File "C:\main.py", line 17, in test2
await test3()
File "C:\main.py", line 13, in test3
traceback.print_stack()

关于python-3.x - 协程的 Python 回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55280869/

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