python異常處理和日志處理方式
今天,總結一下最近編程使用的python異常處理和日志處理的感受,其實異常處理是程序編寫時非常重要的一塊,但是我一開始學的語言是C++,這門語言中沒有強制要求使用try...catch語句,因此我通常編寫代碼的時候忽略了這一塊,直到開始學習java的時候,發(fā)現(xiàn)好多時候編寫代碼必須加上try...catch 模塊,然而我每次都不深入理解,僅僅使用eclipse自動補全功能加上try...catch模塊,或者直接在類上加入throws Exception最省事,完全不用思考。
最近在編寫python代碼的時候,發(fā)現(xiàn)python好多代碼也有try...catch模塊,實在是不想再繼續(xù)不理解了,于是自己思考了一下。
python異常處理
python的異常處理代碼很簡單,如下所示:
try: ...(可能出現(xiàn)異常的代碼) except ...(Python內(nèi)置異常類或者自己實現(xiàn)的異常類) as e: (或者直接except:) ...(處理該異常的代碼)
我平常根本不管異常處理,什么異常都直接不管,因為控制臺會打印出現(xiàn)異常的那一行,然后如果出現(xiàn)錯誤,我就根據(jù)那一行仔細思考可能出現(xiàn)的邏輯錯誤。今天,我仔細思考了一下,我這樣做會出現(xiàn)兩個主要問題:
任何錯誤都會導致程序中斷錯誤提示不明顯,找錯誤的時間變長
解釋:
問題1:我之所以總是忽略該問題,因為我平常編的程序都是比較小的程序,有異常就中斷沒什么影響,但是如果未來 我跟別人合作,編寫一個模塊的程序,如果每次我這個模塊出現(xiàn)異常,整個程序就中斷,那么后果不堪設想!
問題2:為了解釋問題2,我們舉一個例子。假如我要處理一個日志文件,里面的內(nèi)容如下:
Jul 16 03:27:01 node69 sced[22053]: Connection from Jul 16 03:27:01 node69 sced[22053]: SSH: Server;Ltype Jul 16 03:27:01 node69 sced[22053]: SSH: Server;Ltype Jul 16 03:27:11 node69 sced[23417]: Connection from Jul 16 03:27:11 node69 sced[23417]: Connection from Jul 16 03:27:11 node69 sced[23417]: SSH: Server;Ltype Jul 16 03:27:11 node69 sced[23417]: SSH: Server;Ltype Jul 16 03:27:20 node69 sced[23454]: Connection from Jul 16 03:27:20 node69 sced[23454]: Connection from
我的目標是提取每行字符串里面的sced這個名字,顯然,使用python一句話即可:
s = line.split()[4].split('[')[0].strip(':')
這樣做沒錯,但是日志文件通常會很多,比如一共有百萬行的日志,而且可能會出現(xiàn)錯誤,比如空行,或者有些日志輸出的只有一半的行,如下所示:
Jul 16 03:27:01 node69 sced[22053]: SSH: Server;Ltype (空行) Jul 16 03:27:11 node69 sced[23417]: Connection from Jul 16 03:27:11 node69 sced[23417]: Connection from Jul 16 03:27:11 (只有一半的行) Jul 16 03:27:11 node69 sced[23417]: SSH: Server;Ltype
這樣在處理的時候,就會拋出數(shù)組越界異常,同時程序中斷,每次我遇到問題,總是自己思考怎么回事,但是 如果不知道異常的那一行什么樣子,我自己思考總是花費很長時間!而且每次解決一個問題,下次再出現(xiàn)另一個 問題的時候,又要重復這個過程!如果我能一次從頭到尾處理這些數(shù)據(jù),遇到問題將問題的那行打印出來,然后 程序還能夠不中斷該多好!顯然,異常語句就應運而生!,代碼如下:
with open(fileName, 'r',encoding = 'utf-8' ,errors='ignore') as f: for line in f.readlines(): try: s = line.split()[4] s = s.split('[')[0].strip(':') theDict[s] = 1 if theDict.get(s,-1) == -1 else theDict[s]+1 #先得到日志的程序名出現(xiàn)次數(shù)的字典 except: logging.exception('文件--' + fileName+'--在解析句子--'+line+'--時出現(xiàn)異常') #exception代表打印時也會打印出系統(tǒng)錯誤提示語句 # raise
一開始,我不知道會遇到什么異常的情況,就把異常打印出來,然后不拋出raise,如果你想要出現(xiàn)異常,后面的數(shù)據(jù)都不處理了,那就把raise注釋去掉,我感覺raise就像程序中的return的作用。
我的目標是運行一次,把所有可能的沒法處理的情況的行都打印出來,如上述的寫法,就實現(xiàn)了這個功能,可見,異常處理的語句多么有用。
總結一下:
編程本質(zhì)就是實現(xiàn)某個邏輯,但是你沒法把邏輯的所有情況都考慮到,此時加上異常處理模塊,將異常打印出來,這樣就能在出現(xiàn)異常時將異常的數(shù)據(jù)提取處理,根據(jù)這些數(shù)據(jù)繼續(xù)改進自己的程序的邏輯!
日志處理
說道日志處理,我最大的體會是我以前編程從來不用日志,每次都是cout、System.out.println或者print這種直接控制臺輸出語句調(diào)試程序,但是最近我研究的方向是日志處理,于是只能仔細看看為啥還需要日志。
比如我上面的代碼,在except后面打印的是logging.exception,這行語句在運行時沒啥區(qū)別,都會在控制臺中顯示對應的異常處理的那句話,但是在后期其作用就大了,因為日志除了打印功能外,有兩個附加功能:
可以根據(jù)設定的等級打印對于日志輸出語句
可以將日志寫本地,為后期查找錯誤時使用
import logging logging.basicConfig(level=logging.DEBUG) #這句話沒次第一次運行時生效,修改必須重啟Console
根據(jù)日志等級,我們就可以控制不同的等級的日志是否顯示,還能控制日志存儲的位置,這樣在我們不在現(xiàn)場調(diào)試的時候,根據(jù)日志的顯示結果就能夠知道程序的異常情況,非常方便!
以上這篇python異常處理和日志處理方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 一文搞懂python異常處理、模塊與包
- Python異常處理與反射相關問題總結
- Python異常處理中容易犯得錯誤總結
- Python打包exe時各種異常處理方案總結
- python基礎之文件操作和異常處理
- Python Selenium異常處理的實例分析
- Python pip install之SSL異常處理操作
- 通過實例了解Python異常處理機制底層實現(xiàn)
- Python異常處理機制結構實例解析
- python異常處理之try finally不報錯的原因
- python except異常處理之后不退出,解決異常繼續(xù)執(zhí)行的實現(xiàn)
- Python Django中間件,中間件函數(shù),全局異常處理操作示例
- Python 異常處理總結
相關文章
深入解析Python中BeautifulSoup4的基礎知識與實戰(zhàn)應用
BeautifulSoup4正是一款功能強大的解析器,能夠輕松解析HTML和XML文檔,本文將介紹BeautifulSoup4的基礎知識,并通過實際代碼示例進行演示,感興趣的可以了解下2024-02-02詳解Numpy中的數(shù)組拼接、合并操作(concatenate, append, stack, hstack, vstac
這篇文章主要介紹了詳解Numpy中的數(shù)組拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05使用TensorFlow對圖像進行隨機旋轉(zhuǎn)的實現(xiàn)示例
這篇文章主要介紹了使用TensorFlow對圖像進行隨機旋轉(zhuǎn)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01Flask 讓jsonify返回的json串支持中文顯示的方法
下面小編就為大家分享一篇Flask 讓jsonify返回的json串支持中文顯示的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03