1. 程式人生 > >python入門系列:異常處理

python入門系列:異常處理

sel man 但是 finall imp 系列 python ner strong

引言

系統內部一開始已經內置了一些特定的錯誤場景,當我們觸發了這個場景時,系統內部就會向外界拋出異常。如果我們沒有處理,程序就會停止運行。
解決異常

通過條件判斷語句在程序內部進行容錯檢測,避免錯誤的發生。缺點: 如果要處理的錯誤太多,會有很多的和業務邏輯無關的代碼。
捕捉異常,然後再處理

try:

可能出現異常的代碼

有異常就會拋出,不會再執行剩下的 try後面的代碼

except xxxError as xxx:

出現異常後,而且被捕捉到的代碼

except可以寫多個,用來捕捉多個不同的異常

else:

異常未被捕捉到所執行的代碼(可以省略)

finally:

不管有沒有異常都會執行的代碼

異常的合並解決

tyr:
1 / 0
print(val)
except (ZeroDivisionError, NameError) as e:
print(e)
else
print("fine like this")

執行結果:division by zero

如果不清楚異常的具體名字,可以寫 Exception進行替代

上下文管理器

在主要代碼的執行前後分別添加一些操作

實現了 enter(), exit()兩個函數的類產生的對象就是上下文管理器

class Test:
def enter(self):
return self

def exit(self, exc_type, exc_val, exc_tb):

exc_type: 異常類型

exc_val: 異常的值

exc_tb: 異常追蹤信息

函數有返回值,True表示異常已經處理,False表示異常還未處理

print(exc_val)
return True
with Test() as x: # as 後面表示對象的enter()方法執行後的返回值
1 / 0 # 產生的異常信息將對號入座傳入exit()的函數參數中

執行結果: division by zero

通過 contexlib模塊,通過生成器快速產生一個上下文管理器

import contexlib

yield之前的代碼相當於 enter()中的代碼,但是返回結果要通過 yield來返回

yield之後的代碼相當於 exit()中的代碼

@contexlib.contexmanager
def test():
print(1)
yield "x here"
print(2)

with test() as x:
print(3)
print(x)

執行結果:

1
3
x here
2
with語句

with open("./xx.txt", "r") as f:
f.readlines()

with open("a.jpg", "rb") as f1, open("b.jpg", "wb") as f2:
content = f1.read()
f2.write(content)
手動拋出異常

通過 raise語句手動拋出異常

自己設計

def set_age(age):
if age <= 0 or age > 150:
raise ValueError("value error")
print("age is %d" % age)

給別人調用

try:
set_age(-18)
except ValueError as e:
print(e)
自定義異常

自定義的異常要直接或間接繼承自:BaseException

class MyException(Exception):
喜歡python + qun:839383765 可以獲取Python各類免費最新入門學習資料!

python入門系列:異常處理