Python 中的調(diào)試與錯(cuò)誤處理-try邑贴、assert斷言語句與logging打印日志到控制臺(tái)與文件詳解

其他關(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半火、infowarning季俩、errorcritical梅掠,通過 logging.basicConfig(level=loggin.CONFIG) 來設(shè)置酌住,其中CONFIG替換為需要設(shè)置的級(jí)別(使用對(duì)應(yīng)的大寫字母店归,上邊五個(gè)分別對(duì)應(yīng):DEBUGINFO酪我、WARNING消痛、ERRORCRITICAL)都哭,默認(rèn)為WARNING秩伞,設(shè)置級(jí)別后,該級(jí)別以下的信息會(huì)被忽略欺矫,比如設(shè)置WARNING纱新,這樣infodebug的信息不會(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盟步,隨后出現(xiàn)的幾起案子藏斩,更是在濱河造成了極大的恐慌,老刑警劉巖却盘,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狰域,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡黄橘,警方通過查閱死者的電腦和手機(jī)兆览,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塞关,“玉大人抬探,你說我怎么就攤上這事。” “怎么了小压?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵线梗,是天一觀的道長。 經(jīng)常有香客問我怠益,道長仪搔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任蜻牢,我火速辦了婚禮烤咧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抢呆。我一直安慰自己煮嫌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般酷鸦。 火紅的嫁衣襯著肌膚如雪敲长。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死儿奶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鳄抒。 我是一名探鬼主播闯捎,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼许溅!你這毒婦竟也來了瓤鼻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤贤重,失蹤者是張志新(化名)和其女友劉穎茬祷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體并蝗,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祭犯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滚停。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沃粗。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖键畴,靈堂內(nèi)的尸體忽然破棺而出最盅,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布檩禾,位于F島的核電站挂签,受9級(jí)特大地震影響疤祭,放射性物質(zhì)發(fā)生泄漏盼产。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一勺馆、第九天 我趴在偏房一處隱蔽的房頂上張望戏售。 院中可真熱鬧,春花似錦草穆、人聲如沸灌灾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锋喜。三九已至,卻和暖如春豌鸡,著一層夾襖步出監(jiān)牢的瞬間嘿般,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工涯冠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炉奴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓蛇更,卻偏偏與公主長得像瞻赶,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子派任,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360