假设我有以下代码:
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对象)?
发布于 2019-03-22 13:40:48
使用traceback.print_stack()将提供与抛出异常完全相同的跟踪:
async def test1():
await test2()
traceback.print_stack()
# raise Exception()
await test2() # Here
await test2()如果希望接收对象而不是打印,可以使用堆栈()。
但是,请注意,您正在做一些奇怪的事情。asyncio协同器不应该运行,使用它的生成器的自然函数(如.send() )。
在asyncio中,您等待协同线,并使用事件循环运行顶级协同线。请看看在文档中是如何做到的。
我编写了另一个小示例,演示如何在使用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()https://stackoverflow.com/questions/55280869
复制相似问题