Python--traceback模塊的基本用法(異常處理)


文章目錄

 

一.Traceback介紹

在日常開發中,我們會做一些基本的異常處理,但是有時候只能打印我們處理的結果或者將異常打印出來,不能直觀的知道在哪個文件中的哪一行出錯。

def func(num1, num2):
try:
x = num1 * num2
y = num1 / num2
return x, y
except Exception as e:
print("錯誤信息:", e)

func(1, 0)
 

運行結果:
在這里插入圖片描述
而使用Python中traceback模塊來進行處理可以直觀異常信息:

import traceback


def func(num1, num2):
try:
x = num1 * num2
y = num1 / num2
return x, y
except:
traceback.print_exc()

func(1, 0)
 

運行結果:
在這里插入圖片描述
此錯誤輸出包含診斷問題所需的所有信息。錯誤輸出的最后一行一般會告訴你引發了什么類型的異常,以及關於該異常的一些相關信息。錯誤信息的前幾行指出了引發異常的代碼文件以及行數。

Python官網中有關traceback介紹
該模塊提供了一個標准接口,用於提取,格式和打印Python程序的堆棧痕跡。 它完全模仿了Python解釋器在打印堆棧跟蹤時的行為。 當您想在程序控制下打印堆棧跡線時,這非常有用,例如在解釋器周圍的“包裝器”中。
Python中的traceback信息均來源於一個叫做traceback object的對象,而這個traceback object通常是通過函數sys.exc_info()來獲取的。

import sys


def func1(num1, num2):
x = num1 * num2
y = num1 / num2
return x, y
def func2():
func1(1, 0)


if __name__ == '__main__':
try:
func2()
except Exception as e:
exc_type, exc_value, exc_traceback = sys.exc_info()
print("exc_type:",exc_type)
print("exc_value:",exc_value)
print("exc_traceback:",exc_traceback)

運行結果:
在這里插入圖片描述
由上可知,sys.exc_info()獲取了當前處理的exception的相關信息,並返回一個元組,元組的第一個數據是異常的類型,第二個返回值是異常的value值,第三個就是我們要的traceback object.

二.Traceback中常用函數

1.traceback.print_tb

作用:如果limit為正,則打印以limit來自traceback 對象tb的堆棧跟蹤條目(從調用方的幀開始)。否則,打印最后一個abs(limit)條目。如果省略限制或無限制,則打印所有條目。如果文件被省略或無文件,則輸出到sys.stderr;否則,它應該是一個打開的文件或類似文件的對象來接收輸出。
在3.5版更改:增加了負限制支持。

import sys
import traceback


def func1(num1, num2):
x = num1 * num2
y = num1 / num2
return x, y
def func2():
func1(1, 0)


if __name__ == '__main__':
try:
func2()
except Exception as e:
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_tb(exc_traceback)

運行結果:
在這里插入圖片描述

說明:traceback.print_tb(tb, limit=None, file=None)
1.tb: 這個就是traceback object, 是我們通過sys.exc_info獲取到的
2.limit: 這個是限制stack trace層級的,如果不設或者為None,就會打印所有層級的stack trace
3.file: 這個是設置打印的輸出流的,可以為文件,也可以是stdout之類的file-like object。如果不設或為None,則輸出到sys.stderr。

2.traceback.print_exception

import sys
import traceback


def func1(num1, num2):
x = num1 * num2
y = num1 / num2
return x, y
def func2():
func1(1, 0)


if __name__ == '__main__':
try:
func2()
except Exception as e:
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_exception(exc_type, exc_value, exc_traceback, limit=None, file=sys.stdout)

運行結果:
在這里插入圖片描述

說明:traceback.print_exception(etype, value, tb, limit=None, file=None, chain=True)
1.前三個參數正好是sys.exc_info()返回的三個值
2.與print_tb相比,打印信息多了開頭的"Traceback (most…)“信息以及最后一行的異常類型和value信息
3.還有一個不同是當異常為SyntaxError時,會有”^"來指示語法錯誤的位置

3.traceback.print_exc

作用:print_exc是簡化版的print_exception, 由於exception type, value和traceback object都可以通過sys.exc_info()獲取,因此print_exc()就自動執行exc_info()來幫助獲取這三個參數。
所以traceback.print_exc(limit=None, file=None, chain=True)可將異常直接打印出來,同時可以將異常信息寫入到文件中

import traceback


def func(num1, num2):
try:
x = num1 * num2
y = num1 / num2
return x, y
except:
traceback.print_exc(file=open('YFater.txt','w+'))

func(1, 0)

運行結果:
在這里插入圖片描述
或者創建內存文件對象:

import traceback
import io


def func(num1, num2):
try:
x = num1 * num2
y = num1 / num2
return x, y
except:
fp = io.StringIO() # 創建內存文件對象
traceback.print_exc(file=fp)
message = fp.getvalue()
print(message)
func(1, 0)

運行結果:
在這里插入圖片描述

4.traceback.format_exc

作用:traceback.format_exc(limit=None, chain=True)返回的是一個字段串,效果與traceback.print_exc()一致,比如我們想通過logger將異常記錄在log里,就可以使用format_exc

import traceback


def func(num1, num2):
try:
x = num1 * num2
y = num1 / num2
return x, y
except:
print(traceback.format_exc())

func(1, 0)
 

運行結果:
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM