1. 程式人生 > >Python捕獲異常堆疊資訊的幾種方法

Python捕獲異常堆疊資訊的幾種方法

程式出錯的時候,我們往往需要根據異常資訊來找到具體出錯的程式碼。簡單地用print列印異常資訊並不能很好地追溯出錯的程式碼:

# -*- coding: utf-8 -*-


def foo(a, b):
    c = a + b
    raise ValueError('test')
    return c


def bar(a):
    print('a + 100:', foo(a, 100))


def main():
    try:
        bar(100)
    except Exception as e:
        print(repr(e))

if __name__ == '__main__':
    main()

輸出:

ValueError('test',)

列印的異常資訊不夠詳細,對錯誤追蹤沒有多大幫助。這時候異常堆疊資訊就派上用場了。下面簡單介紹幾種列印異常堆疊資訊的方法。

1.最簡單的方法之一就是使用logging.exception

# -*- coding: utf-8 -*-
import logging


def foo(a, b):
    c = a + b
    raise ValueError('test')
    return c


def bar(a):
    print('a + 100:', foo(a, 100))


def main():
    try:
        bar(100)
    except Exception as e:
        logging.exception(e)

if __name__ == '__main__':
    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.其它方法:

# -*- coding: utf-8 -*-
import traceback
import sys


def foo(a, b):
    c = a + b
    raise ValueError('test')
    return c


def bar(a):
    print('a + 100:', foo(a, 100))


def main():
    try:
        bar(100)
    except Exception as e:
        # 方法二
        traceback.print_exc()

        # 方法三
        msg = traceback.format_exc()
        print(msg)

        et, ev, tb = sys.exc_info()
        # 方法四
        traceback.print_tb(tb)

        # 方法五
        traceback.print_exception(et, ev, tb)

        # 方法六
        msg = traceback.format_exception(et, ev, tb)
        for m in msg:
            print(m)

if __name__ == '__main__':
    main()