Python中異常處理
高級語言通常都配置了一套try...except...finally的錯誤處理機制。
1、我們先看一個try的機制
try:
res=1/0
except ZeroDivisionError as e:
print("出錯了,除數不能為0",e)
運行結果為:
出錯了,除數不能為0 division by zero
當我們認為某些代碼可能會出錯時,就可以用try來運行這段代碼,如果只選出錯,則後續代碼不會執行
而是直接跳轉至錯誤處理代碼,即except語句塊
2、另外一個例子:
l=[]
dic={}
try:
print(dic[‘name‘])
print(l[-1])
except KeyError as e:
print(‘字典key不存在‘,e)
except IndexError as e:
print("出錯了,下標越界",e)
except Exception as e:#捕捉所有的異常
print("未知異常",e)
else:
print("沒有出現異常...")
finally:#不管出現 異常和不出現異常,都會執行
print("什麽時候執行finally")
輸出結果:
字典key不存在 ‘name‘
什麽時候執行finally
key不存在,我們就拋出一個keyerror的錯誤,下標越界,我們就拋出一個indexerror的錯誤
如果沒有錯誤,就在except語句塊後面加一個else,當沒有錯誤發生時,就自動執行else
finally是不管什麽時候都執行的語句
3、記錄錯誤
如果不捕獲錯誤,自然可以讓python解釋器來打印出錯誤堆棧,但是程序也被結束了,既然我們能捕獲錯誤,就
可以把錯誤打印出來,然後分析錯誤,同時讓程序執行下去
Python內置的loging模塊可以記錄錯誤
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar(‘0‘)
except Exception as e:
logging.exception(e)
main()
print(‘END‘)
輸出結果
END
ERROR:root:division by zero
Traceback (most recent call last):
File "C:/Users/zyq64/PycharmProjects/1018/day10/記錄錯誤.py", line 12, in main
bar(‘0‘)
File "C:/Users/zyq64/PycharmProjects/1018/day10/記錄錯誤.py", line 8, in bar
return foo(s) * 2
File "C:/Users/zyq64/PycharmProjects/1018/day10/記錄錯誤.py", line 5, in foo
return 10 / int(s)
ZeroDivisionError: division by zero
同樣是出錯,但是程序打印完錯誤信息後會繼續執行,並正常退出
4、主動拋出錯誤 raise
try:
10 / 0
except ZeroDivisionError:
raise ValueError(‘input error!‘)
輸出結果:
Traceback (most recent call last):
File "C:/Users/zyq64/PycharmProjects/1018/day10/異常處理.py", line 38, in <module>
10 / 0
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/zyq64/PycharmProjects/1018/day10/異常處理.py", line 40, in <module>
raise ValueError(‘input error!‘)
ValueError: input error!
Python中異常處理