运行时检测调用堆栈 python_如何获取python异常调用栈?

今天调试代码,突然发现异常处理时不够完善,只能看到异常是什么,但是定位不到发生异常的是哪一行代码。于是,研究了一下如何获取python的调用栈。

python自带的traceback模块,可以获取调用栈。

给一段示例代码:

import sys

import traceback

try:

a=1/0

except Exception as e:

print('---- repr(e) ----')

print(repr(e))

print('---- sys.exc_info() ----')

print(repr(sys.exc_info()))

print('---- traceback.print_exc() ----')

traceback.print_exc()

print('---- traceback.format_exc() ----')

print(traceback.format_exc())

print('---- traceback.print_stack() ----')

traceback.print_stack()

运行效果如下:

E:\py>python cmd_info.py

---- repr(e) ----

ZeroDivisionError('division by zero')

---- sys.exc_info() ----

(, ZeroDivisionError('division by zero'), )

---- traceback.print_exc() ----

Traceback (most recent call last):

File "cmd_info.py", line 7, in a=1/0

ZeroDivisionError: division by zero

---- traceback.format_exc() ----

Traceback (most recent call last):

File "cmd_info.py", line 7, in a=1/0

ZeroDivisionError: division by zero

---- traceback.print_stack() ----

File "cmd_info.py", line 18, in traceback.print_stack()

sys.exc_info,traceback.print_exc,traceback.format_exc这几个都是打印异常信息,后两者里面能看到发生异常的行号。

traceback.print_stack就是专门用来获取调用栈的,它的打印信息没有行号。还有一个traceback.format_stack函数与之对应,返回一个字符串对象。

再看一个单独显示调用栈的示例:

import traceback

def t1():

traceback.print_stack()

def t2():

t1()

def t3():

t2()

t3()

运行效果如下:

E:\py>python cmd_info.py

File "cmd_info.py", line 15, in t3()

File "cmd_info.py", line 13, in t3

t2()

File "cmd_info.py", line 10, in t2

t1()

File "cmd_info.py", line 7, in t1

traceback.print_stack()

-- EOF --

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值