python traceback class_traceback:让你更加灵活地处理python的异常
異常
異常在python中是屢見不鮮了,程序在執(zhí)行到某一行代碼時(shí),發(fā)現(xiàn)有問題,比如數(shù)組索引越界,變量沒有定義啊等等,此時(shí)就會拋出異常
捕獲異常
在python,一般都是使用try···except來對異常進(jìn)行捕獲
python
try:
1 / 0
except Exception as e:
print(e) # division by zero
然而僅僅只有這些也看不出什么東西來,我們需要知道在哪一行代碼引發(fā)的異常。
大家在程序報(bào)錯(cuò)的時(shí)候,會經(jīng)常看到報(bào)錯(cuò)信息如下
Traceback (most recent call last):
這個(gè)Traceback是什么鬼?實(shí)際上,這是python關(guān)于程序報(bào)錯(cuò)的回溯信息,來自于一個(gè)叫做traceback object的對象,而這個(gè)traceback object對象是通過sys.exc_info()來獲取的
traceback對象
python
import sys
try:
1 / 0
except Exception as e:
print(e) # division by zero
exc_type, exc_value, exc_tb = sys.exc_info()
print(exc_type) #
print(exc_value) # division by zero
print(exc_tb) #
可以看到,sys.exc_info()獲取了當(dāng)前處理的exception的相關(guān)信息,并返回一個(gè)元組。元組的第一個(gè)元素是異常的類型,第二個(gè)元素是異常的value值,第三個(gè)異常信息則是traceback object。print(e)打印的是異常的值。
有了traceback object我們則可以打印和格式化traceback的相關(guān)信息
traceback模塊
print_tb
接收一個(gè)tracebackobject
python
import sys
import traceback
try:
1 / 0
except NameError as e:
exc_type, exc_value, exc_tb = sys.exc_info()
traceback.print_tb(exc_tb)
"""
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in
1 / 0
"""
# 如果我們不捕獲異??纯摧敵錾?#xff1f;
"""
Traceback (most recent call last):
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in
1 / 0
ZeroDivisionError: division by zero
"""
# 可以看到最后一行的ZeroDivisionError則是異常類型,division by zero則是異常值。中間的則是我們的traceback object
然而除了traceback object,print_tb還可以接收兩個(gè)參數(shù)
limit
比如我們在調(diào)用C函數(shù)出現(xiàn)了異常,但我們是先調(diào)用A函數(shù),在A函數(shù)里面調(diào)用B函數(shù),在B函數(shù)里面調(diào)用C函數(shù),limit參數(shù)則是限制stack trace的層級的,如果為None也就是不指定,那么會打印所有層級
python
import sys
import traceback
defC():
1 / 0
defB():
C()
defA():
B()
try:
A()
except Exception as e:
exc_type, exc_value, exc_tb = sys.exc_info()
traceback.print_tb(exc_tb)
"""
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 9, in B
C()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in C
1 / 0
"""
traceback.print_tb(exc_tb, limit=2)
"""
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
"""
file
可以指定file,輸出到某個(gè)文件里,默認(rèn)是sys.stderr
print_exception
與print_tb相比多了兩個(gè)參數(shù),需要傳入exc_type,exc_value,exc_tb,也就是sys.exc_info返回的三個(gè)值。與print_tb相比,打印信息多了開頭的Traceback (most recent call last):,以及最后一行的異常類型和value信息。還有一個(gè)不同是當(dāng)異常為SyntaxError時(shí),會有"^"來指示語法錯(cuò)誤的位置
python
import sys
import traceback
defC():
1 / 0
defB():
C()
defA():
B()
try:
A()
except Exception as e:
exc_type, exc_value, exc_tb = sys.exc_info()
traceback.print_exception(exc_type, exc_value, exc_tb)
"""
Traceback (most recent call last):
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 9, in B
C()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in C
1 / 0
ZeroDivisionError: division by zero
"""
可以看到,打印的結(jié)果和報(bào)錯(cuò)的信息是一樣的。
print_exc
和print_exception類似,只不過不需要我們手動的傳入sys.exc_info返回的三個(gè)值,而是會自動幫我們調(diào)用
python
import sys
import traceback
defC():
1 / 0
defB():
C()
defA():
B()
try:
A()
except Exception as e:
traceback.print_exc()
"""
Traceback (most recent call last):
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 9, in B
C()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in C
1 / 0
ZeroDivisionError: division by zero
"""
format_exc
和print_exc一樣,只不過是以字符串的形式返回,需要我們自己手動打印
python
import sys
import traceback
defC():
1 / 0
defB():
C()
defA():
B()
try:
A()
except Exception as e:
tb_info = traceback.format_exc()
print(tb_info)
"""
Traceback (most recent call last):
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 9, in B
C()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in C
1 / 0
ZeroDivisionError: division by zero
"""
總結(jié)
以上是生活随笔為你收集整理的python traceback class_traceback:让你更加灵活地处理python的异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 多个filters_vue自定义
- 下一篇: vue 自己写上传excel组件_vue