Python的錯誤處理機制

2021-09-08 14:16:20 字數 3663 閱讀 7062

高階語言通常都內建了一套try...except...finally...的錯誤處理機制,python也不例外。

try

:print

('try...'

) r =8/

0print

('result:'

, r)

except zerodivisionerror as e:

print

('except:'

, e)

finally

:print

('finally...'

)print

('end'

)

當我們覺得有些**可能會出錯時,就可以用try來執行這段**,如果執行出錯,則不會往後繼續執行,而是轉到except語句塊,執行完except後,如果有finally語句塊,則執行,沒有則執行完畢。上面的**在計算8 / 0時會出錯:

try..

.except

: division by zero

finally..

.end

錯誤應該有很多種類,如果發生了不同型別的錯誤,應該由不同的except語句塊處理,可以有多個except來捕獲不同型別的錯誤:

try

:print

('try...'

) r =10/

int(

'a')

print

('result:'

, r)

except valueerror as e:

print

('valueerror:'

, e)

except zerodivisionerror as e:

print

('zerodivisionerror:'

, e)

finally

:print

('finally...'

)print

('end'

)

python的錯誤其實也是class,所有的錯誤型別都繼承自baseexception,所以在使用except時需要注意的是,它不但捕獲該型別的錯誤,同時也捕獲該型別的子類錯誤,比如:

try

: foo(

)except valueerror as e:

print

('valueerror'

)except unicodeerror as e:

print

('unicodeerror'

)

第二個except永遠也捕獲不到unicodeerror,因為unicodeerrorvalueerror的子類,如果有,也被第乙個except給捕獲了。

因為錯誤是class,捕獲乙個錯誤就是捕獲到該class的乙個例項。因此,錯誤是有意建立並丟擲的。python的內建函式會丟擲很多態別的錯誤,我們自己編寫的函式也可以丟擲錯誤。如果要丟擲錯誤,首先根據需要,可以定義乙個錯誤的class,選擇好繼承關係,然後,用raise語句丟擲乙個錯誤:

# err_raise.py

class

fooerror

(valueerror)

:pass

deffoo

(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

python已有的內建的錯誤型別有valueerror,typeerror等等,一般情況盡量使用python內建的錯誤型別。

def

foo(s)

: n =

int(s)

assert n !=0,

'n is zero!'

return

10/ n

foo(

'0')

assert的意思是,表示式n != 0應該是true,否則,根據程式執行的邏輯,後面的**肯定會出錯。如果斷言失敗,assert語句本身就會丟擲assertionerror

traceback (most recent call last)

: file "/users/xh/desktop/bishe/sada.py"

, line 7,in

foo(

'0')

file "/users/xh/desktop/bishe/sada.py"

, line 3

,in foo

assert n !=0,

'n is zero'

assertionerror: n is zero

assert比,logging不會丟擲錯誤,而且可以輸出到檔案:

import logging

logging.basicconfig(level=logging.info)

s ='0'

n =int

(s)logging.info(

'n = %d'

% n)

print(10

/ n)

看到輸出了:

info:root:n =

0traceback (most recent call last)

: file "/users/xh/desktop/bishe/sada.py"

, line 6,in

print(10

/ n)

zerodivisionerror: division by zero

這就是logging的好處,它允許你指定記錄資訊的級別,有debug,info,warning,error等幾個級別,當指定level=info,logging.debug就不起作用了。這樣一來,可以放心地輸出不同級別的資訊,也不用刪除,最後統一控制輸出哪個級別的資訊。

錯誤處理機制

一直想對公司的錯誤處理機制進行思考和改進,今天查到如下乙個的答覆,很全面,特轉到這裡 錯誤處理機制一般都是自己定義的,在乙個團隊內部自行設定統一的錯誤處理模式。你可以考慮下面三種 1 錯誤發生即處理 也就是錯誤出現在 就在那裡及時處理,而不進行 或者其他操作。2 集中錯誤處理 錯誤發生後統一 到某乙...

錯誤處理機制

2020 11 05 16 55 14 三個屬性 name 錯誤名字 message 錯誤資訊提示 stack 錯誤堆疊 使用 名字 屬性 a.message 下面 syntaxerror物件 語法錯誤 referenceerror物件 引用了不存在變數 rangeerror物件 值超出有效範圍 t...

Spring Boot錯誤處理機制

摘要 1 springboot預設的錯誤處理機制 預設效果 1 瀏覽器,返回乙個預設的錯誤頁面 瀏覽器傳送請求的請求頭 2 如果是其他客戶端,預設響應乙個json資料 原理 可以參照errormvcautoconfiguration 錯誤處理的自動配置 給容器中.預設效果 1 瀏覽器,返回乙個預設的...