pythontry参数_Python ——Try Except
Debug是學(xué)習(xí)代碼的必經(jīng)之路,代碼運(yùn)行時(shí)出現(xiàn)錯(cuò)誤很常見(jiàn),這個(gè)時(shí)候就需要我們擁有找到錯(cuò)誤并解決錯(cuò)誤的能力,那么try...except將必不可少。
首先上干貨:
import traceback
try:
print("我是函數(shù)主體")
except Exception as e:
traceback.print_exc()
print("出現(xiàn)異常來(lái)這里")
else:
print("沒(méi)異常就繼續(xù)")
finally:
print("最終都會(huì)來(lái)這里")
一、對(duì)上述代碼進(jìn)行拆分
1、else:若try中的函數(shù)沒(méi)有發(fā)生異常,將執(zhí)行else下的代碼。
else 必須放在所有的except之后。
2、finally:無(wú)論有無(wú)異常發(fā)生,都將執(zhí)行finally中的代碼。
以上二者都不是必須的,所以極簡(jiǎn)的模式為:
import traceback
try:
xxxx
except Exception as e:
traceback.print_exc()
二、輸出異常信息
1、print e:這個(gè)語(yǔ)句可謂是新手必備,它可以輸出錯(cuò)誤,但是效果嘛...看例子吧:
try:
a = 10/0
except Exception as e:
print(e)
輸出結(jié)果:
division by zero
這個(gè)結(jié)果讓人摸不著頭腦,division by zero!到底是哪里division by zero了?
2、traceback.print_exc() :打印詳細(xì)的異常信息。(神器來(lái)了)
import traceback
try:
a = 10/0
except Exception as e:
traceback.print_exc()
輸出結(jié)果:
Traceback (most recent call last):
File "xxxx\test1.py", line 4, in
a = 10/0
ZeroDivisionError: division by zero
第四行的xxx中division by zero,多么詳細(xì)的信息啊,有時(shí)候,debug就是這么簡(jiǎn)單!
三、sys & traceback
1、sys:說(shuō)一說(shuō)其中的exc_info()方法。
exc_info() 方法會(huì)將當(dāng)前的異常信息以元組的形式返回,該元組中包含 3 個(gè)元素,分別為 type、value 和 traceback,它們的含義分別是:type:異常類型的名稱,它是 BaseException 的子類
value:捕獲到的異常實(shí)例。
traceback:是一個(gè) traceback 對(duì)象。
上例子:
import sys
try:
a = 10/0
except Exception as e:
print(sys.exc_info())
輸出結(jié)果:
(, ZeroDivisionError('division by zero'), )
可看出發(fā)生了一個(gè)ZeroDivisionError類型的錯(cuò)誤,錯(cuò)誤實(shí)例為:division by zero,然后還有一個(gè)traceback 對(duì)象。
可使用traceback 包中的print_tb方法讀取traceback對(duì)象,并打印出來(lái):
import sys
import traceback
try:
a = 10/0
except Exception as e:
traceback_obj = sys.exc_info()[2]
traceback.print_tb(traceback_obj)
輸出結(jié)果:
File "xxxx\test1.py", line 5, in
a = 10/0
可見(jiàn),traceback 對(duì)象內(nèi)包含的就是詳細(xì)的異常信息。
2、traceback 包提供了一整套接口用于提取,格式化和打印Python程序的stack traces信息。
上面說(shuō)道整個(gè)異常的傳播軌跡都存儲(chǔ)在traceback對(duì)象中,可使用traceback包中的方法來(lái)讀取,不過(guò)老是取對(duì)象,讀一下也略繁瑣,然后traceback干脆糖了一波:
上面說(shuō)的:traceback.print_tb()方法只讀取traceback對(duì)象的內(nèi)容。
而:traceback.print_exc()方法更高級(jí),讀取type,value以及traceback對(duì)象的全部?jī)?nèi)容,更厲害的是它直接把sys.exc_info()嵌在了內(nèi)部,無(wú)需手動(dòng)獲取,可以看一下源碼:
def print_exc(limit=None, file=None, chain=True):
"""Shorthand for 'print_exception(*sys.exc_info(), limit, file)'."""
print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain)
ok,然后對(duì)比一下二者輸出的異常信息:
traceback.print_tb()
File "xxxx\test1.py", line 5, in
a = 10/0
traceback.print_exc()
Traceback (most recent call last):
File "xxxx\test1.py", line 4, in
a = 10/0
ZeroDivisionError: division by zero
四、福利環(huán)節(jié):輸出到log
仔細(xì)閱讀源碼的同學(xué)已經(jīng)發(fā)現(xiàn):
def print_exc(limit=None, file=None, chain=True)
通過(guò)傳遞file參數(shù),可以將異常信息直接打印到文件中。
當(dāng)然還有一種方式,尤其是使用logging包的同學(xué):
import logging
logger = logging.getLogger(__name__)
try:
a = 10/0
except Exception as e:
logger.error("Error:",exc_info=True)
logger.error("Error:",exc_info=True) 可直接將詳細(xì)的信息打印到日志文件中,方便日后的debug.
OK了,大概就是這些,若有幫助,記得點(diǎn)贊+關(guān)注
總結(jié)
以上是生活随笔為你收集整理的pythontry参数_Python ——Try Except的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python线程执行完后释放内存_pyt
- 下一篇: python opencv手册_教你用P