1. 程式人生 > >Python中異常處理

Python中異常處理

one 跳轉 val cep ber The put 處理機制 模塊

高級語言通常都配置了一套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中異常處理