Python 錯誤及處理

2021-09-26 04:24:28 字數 3672 閱讀 6742

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語句如果不帶引數,就會把當前錯誤原樣丟擲。此外,在exceptraise乙個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....