自言自語:先來訂個小目標,2個小時做完完異常
正文開始
當檢測到一個錯誤時,解釋器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的“異常”。
例如:
r
方式打開一個不存在的文件open('test.txt','r')
try:
可能發生錯誤的代碼
except:
如果出現異常執行的代碼
需求:嘗試以r
模式打開文件,如果文件不存在,則以w
方式打開。
try:
open('test.txt','r')
except:
open('test.txt','w')
try:
可能發生錯誤的代碼
except 異常類型:
如果捕獲到該異常類型執行的代碼
print(num) # NameError: name 'num' is not defined.
''' :前面是錯誤類型,:後面是異常信息。'''
try:
print(num)
except NameError:
print('有錯誤')
# 運行結果: 有錯誤
當捕獲多個異常時,可以把要捕獲的異常類型的名字,放到except後,並使用元組的方式進行書寫。
try:
print(1/0)
except (NameError,ZeroDivisionError):
print('有錯誤')
# 運行結果: 有錯誤
try:
print(1/0)
except (NameError,ZeroDivisionError) as error:
print(error) # division by zero
Exception 是所有程序異常的父類。
try:
print(1/0)
except Exception as error:
print(error) # division by zero
else表示的是如果沒有異常要執行的代碼
try:
print(1) # 1
except Exception as error:
print(error)
else:
print('這是沒有異常的else') # 這是沒有異常的else
finally表示的是無論是否異常都要執行的代碼,例如關閉文件。
try:
f = open('test.txt','r')
except Exception as error:
f = open('test.txt','w')
else:
print('沒有異常') # 不執行
finally:
f.close()
需求:調用其他py文件的代碼並運行。
需求:
except
捕獲異常並提示用戶。代碼:
import time
try:
f = open('test.txt') # 默認打開方式是 ‘r’
# 嘗試循環讀取內容
try:
while True:
con = f.readline()
# 讀取的值沒有內容,說明已經讀取完成,應該推出循環
if len(con) == 0:
break
print(con)
# 強制停止1s鐘
time.sleep(1)
except:
# ctrl + c 終止程序,太快了,沒時間按,導入time模塊
print('程序被意外終止')
except:
print('該文件不存在')
finally:
f.close()
print('文件已關閉')
效果:
注意:如果你是在pycharm中打開,ctrl+c可能不行,參考上面拓展的內容打開。
在Python中,拋出自定義異常語法為raise 異常類對象
。
作用:用來將不滿足程序邏輯的情況進行反饋給用戶。用來報錯。
需求:密碼長度不足,則報異常(用戶輸入密碼,如果輸入長度不足3位,則報錯,即拋出自定義異常,並捕獲該異常)
# 1. 自定義異常類
class ShortInputError(Exception):
def __init__(self, length,min_len) -> None:
# 用戶輸入密碼的長度
self.length = length
# 系統需求最少的長度
self.min_len = min_len
# 設置拋出異常的描述信息
def __str__(self) -> str:
return f'你輸入的長度是{
self.length},不能少於{
self.min_len}'
# 2. 拋出自定義異常
def main():
try:
con = input('請輸入密碼:')
if len(con) < 3:
raise ShortInputError(len(con),3)
# 3. 捕獲異常
except Exception as result:
print(result)
else:
print('密碼已經輸入完成')
t = 0
t = 1
while t:
main()