try:
print('try...')
r = 10 / 0
print('result:', r)
except zerodivisionerror as e:
print('except:', e)
finally:
print('finally...')
print('end')
輸出結果:
try...
except: division by zero
finally...
end
當我們認為某些**可能會出錯時,就可以用try
來執行這段**,如果執行出錯,則後續**不會繼續執行,而是直接跳轉至錯誤處理**,即except
語句塊,執行完except
後,如果有finally
語句塊,則執行finally
語句塊,至此,執行完畢。
如果沒有錯誤發生,所以except
語句塊不會被執行,但是finally
如果有,則一定會被執行(可以沒有finally
語句)。
python的錯誤其實也是class,所有的錯誤型別都繼承自baseexception
,所以在使用except
時需要注意的是,它不但捕獲該型別的錯誤,還把其子類也「一網打盡」。
常見的錯誤型別和繼承關係
如果錯誤沒有**獲,它就會一直往上拋,最後被python直譯器捕獲,列印乙個錯誤資訊,然後程式退出。
# err.py:
def f3(s):
return 10 / int(s)
def f2(s):
return f3(s) * 2
def f1():
f2('0')
f1()
執行結果:
traceback (most recent call last):
file "c:\users\user\desktop\test1.py", line 10, in f1()
file "c:\users\user\desktop\test1.py", line 8, in f1
f2('0')
file "c:\users\user\desktop\test1.py", line 5, in f2
return f3(s) * 2
file "c:\users\user\desktop\test1.py", line 2, in f3
return 10 / int(s)
zerodivisionerror: division by zero
我們可以看到,先列印f1,然後f2,最後f3。
出錯的時候,一定要分析錯誤的呼叫棧資訊,才能定位錯誤的位置。
python內建的logging
模組可以非常容易地記錄錯誤資訊:
import logging
def f3(s):
return 10 / int(s)
def f2(s):
return f3(s) * 2
def f1():
try:
f2('0')
except exception as e:
logging.exception(e)
f1()
print("end")
輸出結果:
error:root:division by zero
traceback (most recent call last):
file "c:\users\user\desktop\test1.py", line 11, in f1
f2('0')
file "c:\users\user\desktop\test1.py", line 7, in f2
return f3(s) * 2
file "c:\users\user\desktop\test1.py", line 4, in f3
return 10 / int(s)
zerodivisionerror: division by zero
end
通過配置,logging
還可以把錯誤記錄到日誌檔案裡,方便事後排查。
用raise
語句丟擲乙個錯誤。
# err_raise.py
class fooerror(valueerror):
pass
def foo(s):
n = int(s)
if n==0:
raise fooerror('invalid value: %s' % s)
return 10 / n
foo(『0』)
執行,可以最後跟蹤到我們自己定義的錯誤:
$ python3 err_raise.py
traceback (most recent call last):
file "err_throw.py", line 11, in foo('0')
file "err_throw.py", line 8, in foo
raise fooerror('invalid value: %s' % s)
__main__.fooerror: invalid value: 0
還有一種丟擲的方式:
def foo(s):
n = int(s)
if n==0:
raise valueerror('invalid value: %s' % s)
return 10 / n
def bar():
try:
foo('0')
except valueerror as e:
print('valueerror!')
raise
bar()
在bar()
中,捕獲到錯誤後,又把錯誤丟擲了。
好比乙個員工處理不了乙個問題時,就把問題拋給他的老闆,如果他的老闆也處理不了,就一直往上拋,最終會拋給ceo去處理。
raise
語句如果不帶引數,就會把當前錯誤原樣丟擲。此外,在except
中raise
乙個error
,還可以把一種型別的錯誤轉化成另一種型別(邏輯合理即可):
try:
10 / 0
except zerodivisionerror:
raise valueerror('input error!')
變數和資料型別
list和tuple
條件語句和迴圈
dict和set
函式切片+迭代+生成器
生成器和迭代器
函式式程式設計
模組物件導向程式設計
物件導向高階程式設計
定製類列舉類和元類
錯誤及處理
Python 錯誤處理及除錯
try.except.finally.的錯誤處理機制 try print try.r 10 0print result r except zerodivisionerror as e print except e finally print finally.當有zerodivisionerror錯誤...
Nutch,hadoop錯誤及處理
1.nutch在eclipse中除錯時,除了參考nutchtutorial 中配置,還要注意nutch default.xml中plugin.folder屬性的設定 與工程中相應的plugin資料夾一致,例 src plugin 否則或出現找不到plugin的錯誤。當然執行nutch bin的時候就...
Tsung 錯誤及處理
執行 usr lib tsung bin tsung stats.pl 出現錯誤 1.cant exec gnuplot.需要安裝gnuplot 2.can t locate template.pm in inc inc contains etc perl usr local lib perl 5....