首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >coroutine的Python回溯

coroutine的Python回溯
EN

Stack Overflow用户
提问于 2019-03-21 12:51:14
回答 1查看 1.6K关注 0票数 4

假设我有以下代码:

代码语言:javascript
复制
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对象)?

EN

回答 1

Stack Overflow用户

发布于 2019-03-22 13:40:48

使用traceback.print_stack()将提供与抛出异常完全相同的跟踪:

代码语言:javascript
复制
async def test1():
    await test2()

    traceback.print_stack()
    # raise Exception()

    await test2() # Here
    await test2()

如果希望接收对象而不是打印,可以使用堆栈()

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

asyncio中,您等待协同线,并使用事件循环运行顶级协同线。请看看在文档中是如何做到的。

我编写了另一个小示例,演示如何在使用asyncio常规方式时在内部协同内打印开始:

代码语言:javascript
复制
import asyncio
import traceback


async def test3():
    traceback.print_stack()


async def test2():
    await test3()


async def test1():
    await test2()


asyncio.run(test1())

你会看到:

代码语言:javascript
复制
  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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55280869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档