Python用異常對象來表示異常情況,如果異常對象未被處理或捕捉,程序就會回溯(traceback)中止執行。
異常可以在出錯時自動引發,也可以主動引發。
異常被引發后如果不被處理就會傳播至程序調用的地方,直到主程序(全局作用域),如果主程序仍然沒有異常處理,程序會帶著棧跟蹤終止。
raise:引發異常
>>> raise Exception Traceback (most recent call last):File "<pyshell#1>", line 1, in <module>raise Exception Exception
? >>> raise Exception("error!!!")
? Traceback (most recent call last):
? File "<pyshell#2>", line 1, in <module>
? raise Exception("error!!!")
? Exception: error!!!
常見內建異常類:
類名 | 描述 |
Exception | 所有異常的基類 |
AttributeError | 特性引用或賦值失敗時引發 |
IOError | 試圖打開不存在文件(包括其他情況)時引發 |
IndexError | 在使用序列中不存在的索引時引發 |
KeyError | 使用映射中不存在的鍵引發 |
NameError | 找不到名字(變量)時引發 |
SyntaxError | 在代碼為錯誤形式時引發 |
TypeError | 在內建操作或者函數應用于錯誤類型的對象引發? |
ValueError | 在內建操作或者函數應用于正確的對象,但是該對象使用不合適的值引發 |
ZeroDivision | 在除法或者模除操作的第二個參數為0時引發 |
?
自定義異常類:繼承自Exception
class DefException(Exception):pass
?
捕捉異常:使用try/except語句實現>>> try:
x = int(input("The first num:"))y = int(input("The second num:"))print(x/y) except ZeroDivisionError:print("Error")The first num:5 The second num:0
Error
>>> try:x = int(input("The first num:"))y = int(input("The second num:"))print(x/y) except ZeroDivisionError:print("Error") except ValueError:print("TypeError")The first num:5 The second num:o TypeError
?
用一個塊捕捉多個異常:
>>> try:x = int(input("The first num:"))y = int(input("The second num:"))print(x/y) except (ZeroDivisionError,ValueError):print("Error")The first num:5 The second num:0 Error
?
捕捉對象:
>>> try:x = int(input("The first num:"))y = int(input("The second num:"))print(x/y) except (ZeroDivisionError,ValueError) as e:print(e)The first num:5 The second num:0 division by zero
?
捕捉所有異常:
try:x = int(input("The first num:"))y = int(input("The second num:"))print(x/y) except:print("some errors") The first num:5 The second num: some errors
這種方式會捕捉用戶中止執行的企圖,會隱藏所有程序員未想到并且未做好準備的錯誤。
?
對于異常情況進行處理:
?
#在輸入不合法時循環,直到合法值出現退出循環 while True:try:x = int(input("The first num:"))y = int(input("The second num:"))print(x/y)except:print("Error")else:break#運行結果 The first num:5 The second num:0 Error The first num:6 The second num:3 2.0
?
?finally子句:用在可能的異常后進行清理,不管是否有異常都要執行。在同一個try語句中,不可以和except使用。
x = None try:x = 1/0 finally:print("cleaning")del x#結果 cleaning Traceback (most recent call last):File "input.py", line 4, in <module>x = 1/0 ZeroDivisionError: division by zero***Repl Closed***
?
可以在一條語句中組合使用try,except,else,finally
try:x = 1/0else:print("done") finally:print("cleaning")#運行結果 cleaning***Repl Closed***
?