異常
什麼是異常
python用異常對象(exception object)來表示異常,每一個異常都是一些類的實例,這些實例可以被引發,並且可以用很多種方法進行捕捉並對其進行處理,而不是讓整個程序失效。換句話說如果知道某段代碼可能會導致某種異常,而又不希望程序以棧跟蹤的形式終止,那麼就需要捕捉處理異常
按自己的方式出錯
raise語句
raise語句可以引發異常,它接受異常類或者異常實例作爲參數
一些內建異常
類名 | 描述 |
---|---|
Exception | 所有異常的基類 |
AttributeError | 特性引用或賦值失敗時引發 |
IOError | 試圖打開不存在文件時引發 |
IndexError | 在使用序列不存在的索引時引發 |
KeyError | 在使用映射中不存在的鍵時引發 |
NameError | 在找不到名字(變量)時引發 |
TypeError | 在內建操作或者函數應用於錯誤的對象時引發 |
SyntaxError | 在代碼爲錯誤形式時引發 |
自定義異常類
確保從Exception類繼承
捕捉異常
# 捕捉異常 try/except語句實現
try:
x = 1
y = 0
print(x/y)
except ZeroDivisionError:
print("The second number can't be zero")
多個except子句
# 捕捉異常 多個except子句
try:
x = "x"
y = 0
print(x/y)
except ZeroDivisionError:
print("The second number can't be zero")
except TypeError:
print("That wasn't number")
用塊捕捉多個異常
# 捕捉異常 用塊捕捉多個異常
try:
x = "x"
y = 0
print(x/y)
except (ZeroDivisionError, TypeError):
print("There's something wrong with your data")
捕捉對象
# 捕捉異常對象
# 可以顯示地捕捉異常對象,能瞭解到發生了什麼,但程序會繼續運行
try:
x = "x"
y = 0
print(x/y)
except (ZeroDivisionError, TypeError) as e:
print(e)
finally
它可以用來在可能的異常後進行清理,它和try子句聯合使用,finally子句肯定會被執行,,不管try子句中是否發生異常
# finally子句
try:
x = "x"
y = 0
print(x/y)
except (ZeroDivisionError, TypeError) as e:
print(e)
finally:
print("Always execute")
異常和函數
如果異常在函數內引發而不被處理,它就會傳播至函數調用的地方,如果在那裏也沒有處理異常,他就會繼續傳播,一直到達主程序。如果那裏沒有異常處理程序,程序就會帶着棧跟蹤終止
# 異常傳遞到調用函數
def faulty():
raise Exception("Something is wrong")
def ignore():
faulty()
def handle_exception():
try:
faulty()
except:
print("Exception handled")
# 異常未被處理,導致棧跟蹤
ignore()
"""
結果展示
Traceback (most recent call last):
File "D:/pythonspace/pythontest/sequence.py", line 13, in <module>
ignore()
File "D:/pythonspace/pythontest/sequence.py", line 6, in ignore
faulty()
File "D:/pythonspace/pythontest/sequence.py", line 3, in faulty
raise Exception("Something is wrong")
"""
# 異常被處理
handle_exception()
# Exception: Something is wrong