python網路程式設計-異常處理-異常捕獲-丟擲異常-斷言-自定義異常-UDP通訊-socketserver模組應用-03
阿新 • • 發佈:2021-08-10
異常捕獲
異常:程式在執行過程中出現了不可預知的錯誤,並且該錯誤沒有對應的處理機制,那麼就會以異常的形式表現出來
影響:整個程式無法再正常執行
異常的結構
異常的型別
NameError
異常的資訊
name 'safaf' is not defined
異常的位置
'''
Traceback (most recent call last):
File "E:/PyCharm 2019.1.3/ProjectFile/day010/day029/01 異常處理.py", line 1, in <module>
safaf
'''
異常的種類
語法錯誤
程式錯誤編譯成一般都會直接有提示,提示就應該直接解決的,出現語法錯誤一般是基礎太差
邏輯錯誤
這種錯誤是可以被容忍的,邏輯錯誤無法一眼看出來
針對邏輯上的錯誤可以採用異常處理機制來進行捕獲
常見的錯誤型別
常見的出錯型別 |
原因 |
---|---|
NameError |
名字錯誤 |
SyntaxError |
語法錯誤 |
keyError |
鍵不存在 |
ValueError |
值錯誤 |
IndexError |
索引錯誤 |
如何避免
異常處理
使用:在你認為可能會出現問題的程式碼上方用 try 包起來
注意:try 內部的程式碼塊越少越好 異常處理能少用就少用,不然該報錯的不報錯哪裡錯了你都不知道 像服務端、客戶端斷開連結就需要用到異常處理,你不知道他什麼時候會斷開
異常處理使用模板(try.. except.. else.. finally..)
try:
可能出錯的程式碼
except 出錯型別 as e: # 將報錯資訊賦值給e
錯誤的處理程式碼
except 出錯型別2 as e: # 將報錯資訊賦值給e
錯誤的處理程式碼
except 出錯型別3 as e: # 將報錯資訊賦值給e
錯誤的處理程式碼
# 或者 Exception直接捕獲所有的
except Exception as e: # 可以匹配所有的錯誤型別
BaseException 是 Exception 的父類,也可以捕獲所有型別
錯誤的處理程式碼
else:
當被檢測的程式碼沒有任何異常發生,才會執行這裡面的語句
finally:
無論被檢測的程式碼有沒有異常發生,都會在程式碼執行完後執行這裡面的程式碼
案例
try:
safaf
except NameError as e:
print(e)
else:
print("沒有報錯才會執行我哦~")
finally:
print("管你報不報錯,我都會執行的!")
# name 'safaf' is not defined
# 管你報不報錯,我都會執行的!
try:
print("我沒錯哦~")
except Exception as e: # 捕捉所有異常
print("管你啥錯,我都抓了!")
else:
print("沒有報錯才會執行我哦~")
finally:
print("管你報不報錯,我都會執行的!")
# 我沒錯哦~
# 沒有報錯才會執行我哦~
# 管你報不報錯,我都會執行的!
補充
出錯後會立即停止程式碼執行,去與except中的錯誤型別一個個比較,匹配上了就執行裡面的程式碼,沒匹配上就直接報錯
主動丟擲異常raise
if 'egon' == 'DSB':
pass
else:
raise TypeError('盡說大實話') # 這一行就是報錯的位置
# raise 關鍵字就是用來主動丟擲異常的
斷言assert
斷言不成立直接報錯
l = [1, 2, 3]
assert len(1) < 0 # assert 斷言,預言,猜某個資料的狀態,猜對了不影響程式碼執行,猜錯了直接報錯