1. 程式人生 > 其它 >python網路程式設計-異常處理-異常捕獲-丟擲異常-斷言-自定義異常-UDP通訊-socketserver模組應用-03

python網路程式設計-異常處理-異常捕獲-丟擲異常-斷言-自定義異常-UDP通訊-socketserver模組應用-03

異常捕獲

異常:程式在執行過程中出現了不可預知的錯誤,並且該錯誤沒有對應的處理機制,那麼就會以異常的形式表現出來

影響:整個程式無法再正常執行

異常的結構

異常的型別

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 斷言,預言,猜某個資料的狀態,猜對了不影響程式碼執行,猜錯了直接報錯