其他關(guān)于Python的總結(jié)文章請(qǐng)?jiān)L問:http://www.reibang.com/nb/47435944
Python 中的調(diào)試與錯(cuò)誤處理-try、assert斷言語句與logging打印日志到控制臺(tái)與文件詳解
try… except… finally 語句塊
使用try
來處理錯(cuò)誤語句以及可能出現(xiàn)的異常情況,格式:
try:
…
except ErrorType as e:
…
except OtherErrorType as e:
…
finally:
…
代碼會(huì)嘗試運(yùn)行try
中的內(nèi)容,如果正常就繼續(xù)運(yùn)行劣挫,跳過(多個(gè))except
直接運(yùn)行finally
的代碼,如果出現(xiàn)了except
中期望的錯(cuò)誤东帅,不會(huì)被打斷压固,而是進(jìn)入對(duì)應(yīng)的except
代碼塊,最后依然進(jìn)入運(yùn)行finally
的代碼靠闭,即finally
的代碼是一定會(huì)執(zhí)行的帐我。
一個(gè)例子:
try:
print("in try statement")
a = 10 / 0
except ZeroDivisionError as e:
print("error: ", e)
except ValueError as e:
print("error: ", e)
finally:
print("in finally statement")
assert 語句
assert
斷言語句的意思是,斷定后邊的句子是對(duì)的愧膀,否則就會(huì)有 AssertionError
拋出拦键,并且給出逗號(hào)后邊的信息,注意斷言會(huì)拋出錯(cuò)誤檩淋、打斷程序芬为,但是相比于print
來輸出信息的好處是可以自定義一些更詳細(xì)的錯(cuò)誤信息,往往在為了保證某些通常應(yīng)該成立的條件時(shí)使用蟀悦,比如一個(gè)卷積神經(jīng)網(wǎng)絡(luò)的輸入矩陣的大小媚朦,可以在傳入前使用assert
確保正確。格式:
assert statement, otherwise-information
一個(gè)例子:
def my_print(n):
assert n != 0, "N equals to 0!"
print(n)
my_print(0) # AssertionError: N equals to 0!
在運(yùn)行Python程序時(shí)日戈,使用 -O
參數(shù)可以關(guān)閉斷言询张,使用后,所有的assert
會(huì)被作為pass
處理:
python -O main.py
logging語句
使用logging
可以打印一些信息浙炼,使用時(shí)需要引入 logging
模塊(import logging
)份氧,他和print
相比的好處在于:
- 可以限制打印信息的級(jí)別,一共有五個(gè)級(jí)別鼓拧,從低到高為:
debug
半火、info
、warning
季俩、error
、critical
梅掠,通過logging.basicConfig(level=loggin.CONFIG)
來設(shè)置酌住,其中CONFIG
替換為需要設(shè)置的級(jí)別(使用對(duì)應(yīng)的大寫字母店归,上邊五個(gè)分別對(duì)應(yīng):DEBUG
、INFO
酪我、WARNING
消痛、ERROR
、CRITICAL
)都哭,默認(rèn)為WARNING
秩伞,設(shè)置級(jí)別后,該級(jí)別以下的信息會(huì)被忽略欺矫,比如設(shè)置WARNING
纱新,這樣info
和debug
的信息不會(huì)在被顯示。 - 可以打印信息到控制臺(tái)穆趴,對(duì)應(yīng)于上邊的五個(gè)級(jí)別脸爱,使用
logging
打印信息到控制臺(tái)分別對(duì)應(yīng)著如下的語句:logging.debug("debug logs")
logging.info("info logs")
logging.warning("warning logs")
logging.error("error logs")
-
logging.critical("critical logs")
同時(shí)可以使用logging.basicConfig(format = "YOUR FORMAT")
自定義打印信息的格式,比如(官方文檔中的例子):'%(asctime)s - %(name)s - %(levelname)s: - %(message)s'
- 可以把信息輸出到文件未妹,以便保存簿废,使用
logging.basicConfig(filename='FILENAME',filemode='a')
來設(shè)置,其中filename
即存儲(chǔ)信息的文件络它,filemode
指定寫文件的模式族檬,可選'a'
:追加,或者'w'
:每次重寫兩種化戳。同樣可以使用format
參數(shù)指定打印內(nèi)容的格式单料。如果設(shè)置了這兩個(gè)參數(shù),就不會(huì)再打印到控制臺(tái)迂烁,只會(huì)打印到文件中看尼。
通過使用Handler設(shè)置logging同時(shí)輸出到控制臺(tái)和文件
參考:https://xnathan.com/2017/03/09/logging-output-to-screen-and-file/
這里直接給出示例代碼:
import logging
logger = logging.getLogger() # 不加名稱設(shè)置root logger
logger.setLevel(logging.DEBUG) # 設(shè)置打印信息的全局級(jí)別
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S') # 設(shè)置打印信息格式
# 使用FileHandler輸出到文件
fh = logging.FileHandler('log.txt') # 文件位置
fh.setLevel(logging.DEBUG) # 文件內(nèi)信息級(jí)別
fh.setFormatter(formatter) # 設(shè)置打印格式
# 使用StreamHandler輸出到屏幕
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG) # 打印到屏幕的信息級(jí)別
ch.setFormatter(formatter) # 設(shè)置打印格式
# 添加兩個(gè)Handler
logger.addHandler(ch)
logger.addHandler(fh)