分享

Python捕获异常堆栈信息的几种方法

 刮骨剑 2019-07-02

程序出错的时候,我们往往需要根据异常信息来找到具体出错的代码。简单地用print打印异常信息并不能很好地追溯出错的代码:

  1. # -*- coding: utf-8 -*-
  2. def foo(a, b):
  3. c = a + b
  4. raise ValueError('test')
  5. return c
  6. def bar(a):
  7. print('a + 100:', foo(a, 100))
  8. def main():
  9. try:
  10. bar(100)
  11. except Exception as e:
  12. print(repr(e))
  13. if __name__ == '__main__':
  14. main()

输出:

ValueError('test',)

打印的异常信息不够详细,对错误追踪没有多大帮助。这时候异常堆栈信息就派上用场了。下面简单介绍几种打印异常堆栈信息的方法。

1.最简单的方法之一就是使用logging.exception

  1. # -*- coding: utf-8 -*-
  2. import logging
  3. def foo(a, b):
  4. c = a + b
  5. raise ValueError('test')
  6. return c
  7. def bar(a):
  8. print('a + 100:', foo(a, 100))
  9. def main():
  10. try:
  11. bar(100)
  12. except Exception as e:
  13. logging.exception(e)
  14. if __name__ == '__main__':
  15. main()

输出:

ERROR:root:test
Traceback (most recent call last):
  File "E:/git_work/scrapy_ppt/test.py", line 16, in main
    bar(100)
  File "E:/git_work/scrapy_ppt/test.py", line 11, in bar
    print('a + 100:', foo(a, 100))
  File "E:/git_work/scrapy_ppt/test.py", line 6, in foo
    raise ValueError('test')
ValueError: test

从异常堆栈信息中我们可以不费力气就找出错误代码是哪一行。

 

2.其它方法:

  1. # -*- coding: utf-8 -*-
  2. import traceback
  3. import sys
  4. def foo(a, b):
  5. c = a + b
  6. raise ValueError('test')
  7. return c
  8. def bar(a):
  9. print('a + 100:', foo(a, 100))
  10. def main():
  11. try:
  12. bar(100)
  13. except Exception as e:
  14. # 方法二
  15. traceback.print_exc()
  16. # 方法三
  17. msg = traceback.format_exc()
  18. print(msg)
  19. et, ev, tb = sys.exc_info()
  20. # 方法四
  21. traceback.print_tb(tb)
  22. # 方法五
  23. traceback.print_exception(et, ev, tb)
  24. # 方法六
  25. msg = traceback.format_exception(et, ev, tb)
  26. for m in msg:
  27. print(m)
  28. if __name__ == '__main__':
  29. main()

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多