剛接觸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 object
Python程序的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: <type 'exceptions.NameError'>
exc_value: --func1 exception--
exc_traceback_obj: <traceback object at 0x7faddf5d93b0>
通過以上示例我們可以看出,sys.exc_info()獲取了當前處理的exception的相關信息,并返回一個元組,元組的第一個數據是異常的類型(示例是NameError類型),第二個返回值是異常的value值,第三個就是我們要的traceback object.
有了traceback object我們就可以通過traceback module來打印和格式化traceback的相關信息,下面我們就來看下traceback module的相關函數。
traceback module
Python的traceback module提供一整套接口用于提取,格式化和打印Python程序的stack traces信息,下面我們通過例子來詳細了解下這些接口:
print_tb
import 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 "<ipython-input-23-52bdf2c9489c>", line 11, in main
func1()
File "<ipython-input-23-52bdf2c9489c>", line 6, in func1
raise NameError("--func1 exception--")
這里我們可以發現打印的異常信息更加詳細了,下面我們了解下print_tb的詳細信息:
新聞熱點
疑難解答