python traceback_Python语言Traceback详解

python traceback_Python语言Traceback详解本文主要向大家介绍了 Python 语言 Traceback 详解 通过具体的内容向大家展示 希望对大家学习 Python 语言有所帮助 刚接触 Python 的时候 简单的异常处理已经可以帮助我们解决大多数问题 但是随着逐渐地深入 我们会发现有很多情况下简单的异常处理已经无法解决问题了 如下代码 单纯的打印异常所能提供的信息会非常有限 deffunc1 raiseExcepti func1e

本文主要向大家介绍了Python语言Traceback详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限。def func1():

raise Exception(“–func1 exception–“)def main():

try:

func1() except Exception as e: print eif __name__ == ‘__main__’:

main()执行后输出如下:–func1 exception–通过示例,我们发现普通的打印异常只有很少量的信息(通常是异常的value值),这种情况下我们很难定位在哪块代码出的问题,以及如何出现这种异常。那么到底要如何打印更加详细的信息呢?下面我们就来一一介绍。sys.exc_info和traceback objectPython程序的traceback信息均来源于一个叫做traceback object的对象,而这个traceback object通常是通过函数sys.exc_info()来获取的,先来看一个例子:import sysdef func1():

raise NameError(“–func1 exception–“)def main():

try:

func1() except Exception as e:

exc_type, exc_value, exc_traceback_obj = sys.exc_info() print “exc_type: %s” % exc_type print “exc_value: %s” % exc_value print “exc_traceback_obj: %s” % exc_traceback_objif __name__ == ‘__main__’:

main()执行后输出如下:exc_type: exc_value: –func1 exception–

exc_traceback_obj: 通过以上示例我们可以看出,sys.exc_info()获取了当前处理的exception的相关信息,并返回一个元组,元组的第一个数据是异常的类型(示例是NameError类型),第二个返回值是异常的value值,第三个就是我们要的traceback object.有了traceback object我们就可以通过traceback module来打印和格式化traceback的相关信息,下面我们就来看下traceback module的相关函数。traceback modulePython的traceback module提供一整套接口用于提取,格式化和打印Python程序的stack traces信息,下面我们通过例子来详细了解下这些接口:print_tbimport sysimport tracebackdef func1():

raise NameError(“–func1 exception–“)def main():

try:

func1() except Exception as e:

exc_type, exc_value, exc_traceback_obj = sys.exc_info()

traceback.print_tb(exc_traceback_obj)if __name__ == ‘__main__’:

main()输出:File “”, line 11, in main

func1()

File “”, line 6, in func1 raise NameError(“–func1 exception–“)这里我们可以发现打印的异常信息更加详细了,下面我们了解下print_tb的详细信息:traceback.print_tb(tb[, limit[, file]])tb: 这个就是traceback object, 是我们通过sys.exc_info获取到的limit: 这个是限制stack trace层级的,如果不设或者为None,就会打印所有层级的stack tracefile: 这个是设置打印的输出流的,可以为文件,也可以是stdout之类的file-like object。如果不设或为None,则输出到sys.stderr。print_exceptionimport sysimport tracebackdef func1():

raise NameError(“–func1 exception–“)def func2():

func1()def main():

try:

func2() except Exception as e:

exc_type, exc_value, exc_traceback_obj = sys.exc_info()

traceback.print_exception(exc_type, exc_value, exc_traceback_obj, limit=2, file=sys.stdout)if __name__ == ‘__main__’:

main()输出:Traceback (most recent call last):

File “”, line 13, in main

func2()

File “”, line 9, in func2

func1()

NameError: –func1 exception–看下定义:traceback.print_exception(etype, value, tb[, limit[, file]])跟print_tb相比多了两个参数etype和value,分别是exception type和exception value,加上tb(traceback object),正好是sys.exc_info()返回的三个值另外,与print_tb相比,打印信息多了开头的”Traceback (most…)”信息以及最后一行的异常类型和value信息还有一个不同是当异常为SyntaxError时,会有”^”来指示语法错误的位置print_excprint_exc是简化版的print_exception, 由于exception type, value和traceback object都可以通过sys.exc_info()获取,因此print_exc()就自动执行exc_info()来帮助获取这三个参数了,也因此这个函数是我们的程序中最常用的,因为它足够简单import sysimport tracebackdef func1():

raise NameError(“–func1 exception–“)def func2():

func1()def main():

try:

func2() except Exception as e:

traceback.print_exc(limit=1, file=sys.stdout)if __name__ == ‘__main__’:

main()输出(由于limit=1,因此只有一个层级被打印出来):Traceback (most recent call last):

File “”, line 13, in main

func2()

NameError: –func1 exception–定义如下:traceback.print_exc([limit[, file]])只有两个参数,够简单format_excimport loggingimport sysimport traceback

logger = logging.getLogger(“traceback_test”)def func1():

raise NameError(“–func1 exception–“)def func2():

func1()def main():

try:

func2() except Exception as e:

logger.error(traceback.format_exc(limit=1, file=sys.stdout))if __name__ == ‘__main__’:

main()从这个例子可以看出有时候我们想得到的是一个字符串,比如我们想通过logger将异常记录在log里,这个时候就需要format_exc了,这个也是最常用的一个函数,它跟print_exc用法相同,只是不直接打印而是返回了字符串。traceback module中还有一些其它的函数,但因为并不常用,就不在展开来讲,感兴趣的同学可以看下参考链接中的文档。获取线程中的异常信息通常情况下我们无法将多线程中的异常带回主线程,所以也就无法打印线程中的异常,而通过上边学到这些知识,我们可以对线程做如下修改,从而实现捕获线程异常的目的。以下示例来自weidong的博客文章,稍有修改(见参考链接)import threadingimport tracebackdef my_func():

raise BaseException(“thread exception”)class ExceptionThread(threading.Thread):

def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None):

“””

Redirect exceptions of thread to an exception handler.

“””

threading.Thread.__init__(self, group, target, name, args, kwargs, verbose) if kwargs is None:

kwargs = {}

self._target = target

self._args = args

self._kwargs = kwargs

self._exc = None

def run(self):

try: if self._target:

self._target() except BaseException as e: import sys

self._exc = sys.exc_info() finally: #Avoid a refcycle if the thread is running a function with

#an argument that has a member that points to the thread.

del self._target, self._args, self._kwargs def join(self):

threading.Thread.join(self) if self._exc:

msg = “Thread ‘%s’ threw an exception: %s” % (self.getName(), self._exc[1])

new_exc = Exception(msg) raise new_exc.__class__, new_exc, self._exc[2]

t = ExceptionThread(target=my_func, name=’my_thread’)

t.start()try:

t.join()except:

traceback.print_exc()输出如下:Traceback (most recent call last):

File “/data/code/testcode/thread_exc.py”, line 43, in t.join()

File “/data/code/testcode/thread_exc.py”, line 23, in run self._target()

File “/data/code/testcode/thread_exc.py”, line 5, in my_func

raise BaseException(“thread exception”)Exception: Thread ‘my_thread’ threw an exception: thread exception这样我们就得到了线程中的异常信息。

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229857.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:43
下一篇 2026年3月16日 下午3:43


相关推荐

  • 反编译软件Luyten安装详细步骤

    反编译软件Luyten安装详细步骤以前用 jd gui 感觉挺好用的 最近项目用了 jdk1 8 jd gui 就不好用了 总是显示 INTERNALERRO nbsp 在网上查到 Luyten 可以反编译 jdk1 8 的 java 代码 试用一下 完美运行 特此记录 1 下载源码 解压地址 https github com deathmarine Luyten 解压后 进入可以看到 2 编译打包用 cm

    2026年3月19日
    2
  • vue 子传父 多个值

    vue 子传父 多个值子组件子组件通过 emit 触发父组件中的自定义函数 第一个值为自定义函数名 后面的参数是向父组件传的值 van button click emitGetList type info 搜索 emitGetList this emit refreshList this cityValue this amount this requires 父组件 van button click emitGetList type info

    2025年6月17日
    7
  • 关于智能本质的思考

    关于智能本质的思考

    2022年1月27日
    52
  • matlab中importdata函数导入数据 到工作空间[通俗易懂]

    用load函数导入mat文件大家都会。但是今天我拿到一个数据,文件后缀名居然是‘.data’。该怎么读呢?我只好用matlab界面Workspace区域的“importdata”按钮手工导入该文件。恩,还好,居然成功了。顺便提一下,这个“importdata”按钮功能很强大,连excel文件都能导入。但是如果在脚本里如何导入这种非mat文件呢?这时候就轮到“import

    2022年4月17日
    225
  • iOS Dev (71) ccTouchBegan 无响应的可能原因

    iOS Dev (71) ccTouchBegan 无响应的可能原因iOSDev 71 ccTouchBegan 无响应的可能原因博客 http blog csdn net prevention 作者 大锐哥摘自 LearniPhonea BOOL ccTouchBegan UITouch touchwithEve UIEvent event

    2026年3月26日
    3
  • python中的merge函数_Python Merge函数原理及用法解析[通俗易懂]

    python中的merge函数_Python Merge函数原理及用法解析[通俗易懂]Merge函数的用法jfz免费资源网简单来说Merge函数相当于Excel中的vlookup函数。当我们对2个表进行数据合并的时候需要通过指定两个表中相同的列作为key,然后通过key匹配到其中要合并在一起的values值。jfz免费资源网然后对于merge函数在Pandas中分为1vs1,多(m)vs1,以及多(m)vs多(m)这三种场景。但是平时用的最多的往往是多vs1的这种场景。也就是说2…

    2022年6月3日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号