python入門系列:異常處理
系統內部一開始已經內置了一些特定的錯誤場景,當我們觸發了這個場景時,系統內部就會向外界拋出異常。如果我們沒有處理,程序就會停止運行。
解決異常
通過條件判斷語句在程序內部進行容錯檢測,避免錯誤的發生。缺點: 如果要處理的錯誤太多,會有很多的和業務邏輯無關的代碼。
捕捉異常,然後再處理
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入門系列:異常處理