今天是持續寫作的第 13 / 100 天,
如果你有想要交流的想法、技術,歡迎在評論區留言,
本篇文章主要內容為程式錯誤與例外處理,順帶會說一下內置模塊 logging ,

已完成的文章
- 1.這才是 Python 學習的正確起手姿勢,滾雪球學 Python
- 2. 無門檻學會資料型別與輸入、輸出函式,滾雪球學 Python
- 3. 無轉折不編程,滾雪球學 Python
- 4. 串列一學完,Python 會一半,滾雪球學 Python
- 5. Python 回圈的本質就是一段代碼懶得重復寫
- 6. Python 元組,不可變的串列,滾雪球學 Python
- 7. ? 會查新華字典不?會,Python 字典已經掌握了
- 8. 秘 Python 集合三板斧,滾雪球學 Python
- 9. Python 學習程序的第一個山坡,99%的人都倒在了山坡下
- 10. 比找女朋友還難的技術點,Python 面向物件
- 11. 用別人寫好的代碼,完成我的作業,剩下的時間去摸魚
- 12. 資料放在本地,心里才更踏實,滾雪球學 Python
滾雪球學 Python 目錄
- 已完成的文章
- 十三、Python 程式例外處理與 logging 模塊
- 13.1 程式例外
- 13.1.1 最常見的錯誤 - 除數為 0
- 13.1.2 try ... except 陳述句
- 13.1.3 try ... except ... else 陳述句
- 13.2 例外型別
- 13.2.1 常見的例外型別
- 13.2.2 捕捉多個例外
- 13.2.3 一個 except 捕獲多個例外
- 13.2.4 直接拋出例外
- 13.3 finally 陳述句
- 13.4 日志模塊 logging
- 13.4.1 logging 模塊
- 13.4.2 格式化 logging 日志資訊
- 13.4.3 程式日志 logging 輸出到檔案中
- 13.4.4 停用程式日志
- 13.5 這篇博客的總結
本系列文章將在 2021 年春節前完成,歡迎關注,點贊,評論 --- 夢想橡皮擦
想學 Python 爬蟲,可以訂閱橡皮擦專欄哦~ 🈲🈲🈲 點擊發現驚喜 🈲🈲🈲
十三、Python 程式例外處理與 logging 模塊
13.1 程式例外
程式例外,就是程式出錯了,程式員一般叫做 BUG(八哥),寫程式不出錯是不可能發生的事情,而程式員要做的事情就是及時的捕獲錯誤,修改錯誤,
13.1.1 最常見的錯誤 - 除數為 0
在數學中也存在類似的問題,除數不可以為 0,相同的概念在編程中也是存在的,
num1 = 20
num2 = 0
num3 = num1 / num2
print(num3)
運行代碼出現下面的錯誤:
Traceback (most recent call last):
File "D:/gun/2/demo7.py", line 3, in <module>
num3 = num1 / num2
ZeroDivisionError: division by zero
錯誤內容就是末尾的 ZeroDivisionError: division by zero ,當出現錯誤程式崩潰,終止運行,錯誤例外中也提示了錯誤出現的行數 line 3 在第三行,但查看行號排查錯誤在很多時候無法直接解決問題,因為出錯的地方不在行號那一行,修改 BUG 的效率一般會隨著你對 Python 學習的深入逐步增強改善,
13.1.2 try … except 陳述句
剛才的程式出現錯誤就終止運行了,如何避免程式被強迫終止,出現問題提示出問題,然后繼續運行呢?這就是 try … except 陳述句使用的場景了,
語法格式:
try:
可能會出錯的代碼
except 例外物件:
處理例外代碼
按照上述語法格式修改上文代碼,
num1 = 20
num2 = 0
try:
num3 = num1 / num2
except ZeroDivisionError:
print("除數不可以為 0 ")
此時程式不會報錯,當發現除數為 0 會進入例外處理,直接輸出除數不能為 0,
try 表示測驗代碼部分是否存在例外,except 表示捕獲例外,前提是出現例外,如果 try 陳述句中沒有任何錯誤,except 中的代碼不會執行,
還有一點需要注意,在 except 后面是例外物件,該例外物件我們設定為 ZeroDivisionError 這是因為已經知道是會出現這個例外,如果在編碼程序中不知道會出現哪種例外,依舊會出現錯誤,
num1 = 20
num2 = "abc"
try:
num3 = num1 / num2
except ZeroDivisionError:
print("除數不可以為 0 ")
上述代碼依舊會報錯,報錯的例外為:
Traceback (most recent call last):
File "D:/gun/2/demo7.py", line 4, in <module>
num3 = num1 / num2
TypeError: unsupported operand type(s) for /: 'int' and 'str'
如果想在 except 后面支持本例外,需要添加上 TypeError,
num1 = 20
num2 = "abc"
try:
num3 = num1 / num2
except (ZeroDivisionError,TypeError):
print("除數不可以為 0 ")
也可以分開撰寫:
num1 = 20
num2 = "abc"
try:
num3 = num1 / num2
except ZeroDivisionError:
print("除數不可以為 0 ")
except TypeError:
print("除數型別不對")
該種寫法在書寫的時候需要預先知道會提示哪種例外,如果例外不清楚那可以省略例外物件,直接使用下述代碼即可,
num1 = 20
num2 = "abc"
try:
num3 = num1 / num2
except:
print("除數不可以為 0 ")
13.1.3 try … except … else 陳述句
在 try … except 陳述句后面可以增加一個 else 陳述句,該陳述句表示的含義可以按照如下描述進行理解,當出現例外的時候執行 except 陳述句中的代碼,當無例外執行 else 陳述句代碼,
num1 = 20
num2 = 1
try:
num3 = num1 / num2
except ZeroDivisionError:
print("除數不可以為 0 ")
except TypeError:
print("除數型別不對")
else:
print("無例外,會被執行")
以上代碼無錯誤,那 else 陳述句就會被執行到,
13.2 例外型別
13.2.1 常見的例外型別
在撰寫代碼的程序中,你需要掌握一些常見的例外型別,熟記它們可以幫助你快速進行錯誤排查,
- AttributeError 某個物件沒有屬性
- Exception 通用型例外物件
- FileNotFoundError 找不到檔案
- IOError 輸入輸出例外
- IndexError 索引例外
- KeyError 鍵例外
- NameError 物件名稱例外
- SyntaxError 語法錯誤
- TypeError 型別錯誤
- ValueError 值錯誤
以上錯誤都屬于常見錯誤,其中重點以 Exception 通用例外物件與 SyntaxError 語法錯誤為主,它們兩個是最常出現的,
很多時候其實直接使用通用例外物件 Exception 就可以了,不需要記住所有的例外型別的,
13.2.2 捕捉多個例外
在上文已經接觸過捕捉多個例外的語法格式了,可以在學習一下,
try:
可能出錯的代碼塊
except 例外物件1:
例外處理代碼塊
except 例外物件2:
例外處理代碼塊
13.2.3 一個 except 捕獲多個例外
Python 也支持使用一個 except 捕獲多個例外,具體語法格式如下:
try:
可能出錯的代碼塊
except (例外物件1,例外物件2...):
例外處理代碼塊
13.2.4 直接拋出例外
捕獲到例外之后,可以直接拋出 Python 給內置好的例外資訊,例如:
num1 = 20
num2 = 0
try:
num3 = num1 / num2
except ZeroDivisionError as e:
print(e)
except TypeError as e:
print(e)
else:
print("無例外,會被執行")
注意 except 后面例外物件使用 as 關鍵字起了一個別名叫做 e,然后直接輸出 e 就是 Python 內置好的錯誤資訊了,這里的 e 可以為任意名稱,遵循變數命名規則即可,
13.3 finally 陳述句
try … except 陳述句還可以和 finally 陳述句配合,形成下述語法格式:
try:
可能出錯的代碼塊
except:
代碼出錯執行的代碼塊
else:
代碼正常執行的代碼塊
finally:
無論代碼是否有例外出現都會執行的的代碼塊
finally 語法需要與 try 陳述句配合使用,無論是否有例外出現都會執行該陳述句內容,具體代碼大家可以自行測驗即可,
13.4 日志模塊 logging
13.4.1 logging 模塊
在 Python 中為了更好的記錄程式錯誤資訊,提供了一個 logging 模塊供我們使用,該模塊提供了 5 個等級用于標記日志資訊的等級,
- DEBUG 等級,使用 logging.debug() 顯示
- INFO 等級,記錄類的日志
- WARNING 等級,警告級別,存在潛在風險
- ERROR 等級,引發錯誤
- CRITICAL 等級,引發系統出現問題,最高等級
匯入 logging 模塊之后,可以使用下述內容設定顯示資訊的等級,
import logging
logging.basicConfig(level=logging.DEBUG)
五個等級輸出函式如下:
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("DEBUG")
logging.info("INFO")
logging.warning("WARNING")
logging.error("ERROR")
logging.critical("CRITICAL")
輸出內容如下:
DEBUG:root:DEBUG
INFO:root:INFO
WARNING:root:WARNING
ERROR:root:ERROR
CRITICAL:root:CRITICAL
上述代碼因為設定的等級是 DEBUG,所以所有的日志資訊都會輸出,如果設定為 WARNING,例如下述代碼,查看輸出內容,
import logging
# 注意看這里的設定
logging.basicConfig(level=logging.WARNING)
logging.debug("DEBUG")
logging.info("INFO")
logging.warning("WARNING")
logging.error("ERROR")
logging.critical("CRITICAL")
因為設定了 logging 輸出等級是 WARNING,所以較低等級的 DEBUG 與 INFO 將不再輸出,這樣可以隨著程式開發不斷的提高等級,最終提高到 CRITICAL,
13.4.2 格式化 logging 日志資訊
可以在全域進行 logging 資訊的格式化,語法格式如下:
logging.basicConfig(level=logging.WARNING,format = "")
在不設定 format 的時候,默認輸出的日志資訊如下,所以輸出內容前面都存在一個 DEBUG:root: 內容,如果設定 format="" 即可洗掉原內容,
DEBUG:root:DEBUG
INFO:root:INFO
WARNING:root:WARNING
ERROR:root:ERROR
CRITICAL:root:CRITICAL
設定 format = "",代碼如下:
import logging
logging.basicConfig(level=logging.WARNING,format= "")
其余內容不需要修改,輸出的日志資訊,已經沒有前面的默認關鍵詞了,
WARNING
ERROR
CRITICAL
對于日志資訊的格式化,還可以增加 asctime ,該內容為時間資訊,例如下述代碼:
import logging
logging.basicConfig(level=logging.WARNING,format= "%(asctime)s")
logging.debug("DEBUG")
logging.info("INFO")
logging.warning("WARNING")
logging.error("ERROR")
logging.critical("CRITICAL")
使用該內容運行結果發現,要輸出的資訊沒有了,這是因為你在 format 引數中只傳了 asctime 一個內容,如果還需要 logging 輸出資訊,需要增加 message,語法如下:
import logging
logging.basicConfig(level=logging.WARNING,format= "%(asctime)s %(message)s")
logging.warning("WARNING")
logging.error("ERROR")
logging.critical("CRITICAL")
學習過 asctime 與 message 之后,你應該對 format 格式化的語法有了一些基本的認知,它應該是一個 %(引數名)s 這樣的結構,如果增加一個 logging 等級引數 levelname,嘗試一下你可以將其拼接到 format 中嗎?
13.4.3 程式日志 logging 輸出到檔案中
程式日志如果都輸出在 Python 控制臺,導致的結果就是控制臺出現大量的除錯資訊,很多時候可以將日志資訊輸出到檔案中,而且實作非常簡單,只需要增加一個引數 filename 即可解決問題,
import logging
logging.basicConfig(filename = "out.txt",level=logging.WARNING,format= "%(asctime)s %(message)s")
執行上述代碼之后,會自動在當前根目錄(檔案與目錄可以自己設定)生成一個日志檔案,
13.4.4 停用程式日志
使用下述方法停用日志,
logging.disable(level)
如果希望全部停用,只需要直接限制等級到 CRITICAL 即可,
import logging
logging.basicConfig(level=logging.WARNING,format= "%(asctime)s %(message)s")
logging.disable(level=logging.CRITICAL)
logging.debug("DEBUG")
logging.info("INFO")
logging.warning("WARNING")
logging.error("ERROR")
logging.critical("CRITICAL")
13.5 這篇博客的總結
本篇博客主要寫的是例外相關知識,在 Python 代碼的撰寫程序中經常會出現例外,一般情況下程式員都叫做 出 BUG 了,這個 BUG 就是臭蟲的意思,表示程式出臭蟲了,當然很多時候我們也戲稱“無 BUG,不編程”,
發現 BUG,解決 BUG,程式員不是在寫 BUG 的路上,就是在改 BUG 的路上,好友哲理,
關于例外部分,還有如下內容可以擴展,
- 使用 raise 拋出例外
- 使用 traceback 模塊記錄例外資訊到檔案中
- 程式斷言 assert
想學 Python 爬蟲,可以訂閱橡皮擦專欄哦~ 🈲🈲🈲🈲 點擊發現驚喜 🈲🈲🈲🈲
🈚🈚🈚🈚🈚
如果你想跟博主建立親密關系,可以關注博主,或者關注博主公眾號“非本科程式員”,了解一個非本科程式員是如何成長的,
博主 ID:夢想橡皮擦,希望大家點贊、評論、收藏,
CSDN認證博客專家
大學老師
高級產品經理
互聯網從業者
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230301.html
標籤:python
