如何获取python异常调用栈?

2020年7月17日 / 61次阅读 / Last Modified 2020年10月15日
异常处理

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

本文链接:https://www.pynote.net/archives/2271

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top