【问题标题】:Python traceback for coroutine协程的 Python 回溯
【发布时间】:2019-03-21 12:51:14
【问题描述】:

假设我有以下代码:

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)

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

【问题讨论】:

    标签: python-3.x python-asyncio coroutine


    【解决方案1】:

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

    async def test1():
        await test2()
    
        traceback.print_stack()
        # raise Exception()
    
        await test2() # Here
        await test2()
    

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


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

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

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

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多