【Python】異常
阿新 • • 發佈:2020-09-19
異常
一. 瞭解異常
當檢測到一個錯誤時,直譯器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的"異常"。
例如:以 r 方式開啟一個不存在的檔案。
open('test.txt', 'r')
二. 異常的寫法
2.1 語法
try:
可能發生錯誤的程式碼
except:
如果出現異常執行的程式碼
2.2 快速體驗
需求:嘗試以 r 模式開啟檔案,如果檔案不存在,則以 w 方式開啟。
try: f = open('test.txt', 'r') except: f = open('test.txt', 'w')
2.3 捕獲指定異常
2.3.1 語法
try:
可能發生錯誤的程式碼
except 異常型別:
如果捕獲到該異常型別執行的程式碼
2.3.2 體驗
try:
print(num)
except NameError:
print('有錯誤')
注意:
- 如果嘗試執行的程式碼的異常型別和要捕獲的異常型別不一致,則無法捕獲異常。
- 一般try下方只放一行嘗試執行的程式碼。
2.3.3 捕獲多個指定異常
當捕獲多個異常時,可以把要捕獲的異常型別的名字,放到except 後,並使用元組的方式進行書寫。
try: print(1/0) except (NameError, ZeroDivisionError): print('有錯誤')
2.3.4 捕獲異常描述資訊
try:
print(num)
except (NameError, ZeroDivisionError) as result:
print(result)
2.3.5 捕獲所有異常
Exception是所有程式異常類的⽗類。
try:
print(num)
except Exception as result:
print(result)
2.4 異常的else
else表示的是如果沒有異常要執行的程式碼。
try: print(1) except Exception as result: print(result) else: print('我是else,是沒有異常的時候執⾏的程式碼')
2.5 異常的finally
finally表示的是無論是否異常都要執行的程式碼,例如關閉檔案。
try:
f = open('test.txt', 'r')
except Exception as result:
f = open('test.txt', 'w')
else:
print('沒有異常,真開⼼')
finally:
f.close()
三. 異常的傳遞
體驗異常傳遞
需求:
- 嘗試只讀方式開啟test.txt檔案,如果檔案存在則讀取檔案內容,檔案不存在則提示使用者即可。
- 讀取內容要求:嘗試迴圈讀取內容,讀取過程中如果檢測到使用者意外終止程式,則 except 捕獲異常並提示使用者。
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
# 如果在讀取⽂件的過程中,產⽣了異常,那麼就會捕獲到
# ⽐如 按下了 ctrl+c
print('意外終⽌了讀取資料')
finally:
f.close()
print('關閉⽂件')
except:
print("沒有這個⽂件")
四. 自定義異常
在Python中,丟擲自定義異常的語法為 raise 異常類物件 。
需求:密碼長度不足,則報異常(使用者輸入密碼,如果輸入的長度不足3位,則報錯,即丟擲自定義異常,並捕獲該異常)。
# ⾃定義異常類,繼承Exception
class ShortInputError(Exception):
def __init__(self, length, min_len):
self.length = length
self.min_len = min_len
# 設定丟擲異常的描述資訊
def __str__(self):
return f'你輸⼊的⻓度是{self.length}, 不能少於{self.min_len}個字元'
def main():
try:
con = input('請輸⼊密碼:')
if len(con) < 3:
raise ShortInputError(len(con), 3)
except Exception as result:
print(result)
else:
print('密碼已經輸⼊完成')
main()