什麼是異常?
Python無法正常處理程序時就會發生一個異常,這時Python就會拋出一個對象,表示這是一個錯誤。
必須處理異常,否則程序可能會停止運行,或者出現異常現象。
如:4/0就會拋出異常,因爲除數不可以爲0。
如:a=[1,2,3],訪問a[10]就會拋出異常,因爲下標超出了範圍(0~2)。
示例:
a=[1,2,3]
print(a[10])
拋出異常:
常見異常
ImportError # 引入模塊錯誤,大部分是路徑問題或名稱錯誤。
ModuleNotFoundError # 模塊不存在
IOError # 輸入輸出異常,大部分是無法打開文件
FileNotFoundError # 文件不存在
KeyError # 訪問字典裏不存在的鍵
ZeroDivisionError # 除(或取模)零
NameError # 變量未定義
TypeError # 實參的類型與要求的不符(如time.sleep("1"))
ValueError # 實參的值與要求的不符,即使類型正確(如int("one"))
IndexError # 下標越界
小貼士:
Python中存在許許多多的異常,具體情況具體處理。
捕獲並處理異常
程序拋出異常後,可能會停止運行。因爲程序畢竟是程序,不夠智能,並不會處理它們。
程序會根據不同的情況,拋出不同的異常。
需要捕獲相應的異常並進行處理,程序纔會正常的運行下去。
綜上所述,提前用代碼告知Pyton,出現各種異常該如何處理。
try:
f=open("hello.txt","r")
except FileNotFoundError as fileNotFoundError:
print("文件打開失敗:",fileNotFoundError)
except: #其他錯誤
print("其他錯誤")
解釋:
- 在try語句塊中執行可能發生錯誤的代碼
- 使用except來捕獲異常
- FileNotFoundError是異常名,表示文件不存在
- fileNotFoundError爲對象名,可自定義,通過此對象來處理異常
- 當文件不存在,異常就會被fileNotFoundError捕獲
- 出現其他錯誤,就會輸出:其他錯誤
手動拋出異常
手動拋出異常,再捕獲異常,進行處理。
如:需要用戶輸入數字,用戶卻輸入了字符
age=input("請輸入年齡:")
if not age.isdigit():
raise ValueError("值錯誤")
若發生異常:
若沒有發生異常:
解釋:
- 使用關鍵字raise拋出異常
- 拋出異常ValueError
- 上例沒有對異常進行捕獲處理,只是拋出。
- 有些異常發生時,程序不會停止運行,如ValueError(退出碼爲0)
手動拋出異常,並捕獲、處理異常:
try:
age=input("請輸入年齡:")
if not age.isdigit():
raise ValueError("值錯誤")
except ValueError as valueError:
print(valueError)
exit(1)
若發生異常:
若沒有發生異常:
自定義異常
- 所有的異常都是Exception或Exception的子類
- 繼承Exception,成爲它的子類,即爲自定義異常。
class MyError(Exception): #繼承了Exception
def __init__(self,value): #構造函數
self.value=value
def __str__(self): #強制轉換
return str(self.value)
try:
raise MyError("我的錯誤") #拋出異常
except MyError as myError: #捕獲異常
print(myError) #處理異常
try-else
- 當try塊中沒有發生異常,就會執行else語句塊
try:
f=open("hello.txt","r")
except FileNotFoundError as fileNotFoundError:
print(fileNotFoundError)
else:
print("沒有發生錯誤")
try-finally
- 無論是否發生異常都將執行finally語句塊
try:
f=open("hello.txt","r")
except FileNotFoundError as fileNotFoundError:
print(fileNotFoundError)
finally:
print("無論是否異常,都會輸出")