Learning Python 4 錯誤處理

2021-07-09 01:40:21 字數 2768 閱讀 1700

在程式執行過程中,總會遇到各種各樣的錯誤。

有的錯誤是程式編寫有問題造成的,比如本來應該輸出整數結果輸出了字串,這種錯誤我們通常稱之為bug,bug是必須修復的。

有的錯誤是使用者輸入造成的,比如讓使用者輸入email位址,結果得到乙個空字串,這種錯誤可以通過檢查使用者輸入來做相應的處理。

還有一類錯誤是完全無法在程式執行過程中**的,比如寫入檔案的時候,磁碟滿了,寫不進去了,或者從網路抓取資料,網路突然斷掉了。這類錯誤也稱為異常,在程式中通常是必須處理的,否則,程式會因為各種問題終止並退出。

python內建了一套異常處理機制,來幫助我們進行錯誤處理。

此外,我們也需要跟蹤程式的執行,檢視變數的值是否正確,這個過程稱為除錯。python的pdb可以讓我們以單步方式執行**。

最後,編寫測試也很重要。有了良好的測試,就可以在程式修改後反覆執行,確保程式輸出符合我們編寫的測試。

高階語言一般都內建一套try....except....finally的錯誤處理機制。

try的乙個例子:

try:

print ('try...')

r=10/0

print ('result:%s'%r)

except zerodivisionerror as e:

print ('except:',e)

finally:

print('finally...')

print ('end')

如果我們認為某些**可能出錯,就可以用try來執行這段**,如果**出錯,則後續**不會繼續執行,而是直接跳轉至錯誤處理**,即except語句塊處,執行完後,如果有finally語句塊,則執行finally語句塊,至此,執行完畢。

如果沒有錯誤發生,except語句塊不會執行,但是finally有的話,會被執行。(可以沒有finally語句)。然後,程式繼續按照流程往下走。

若有多種型別的錯誤,可以使用多個except來捕獲不同型別的錯誤。

try:

print('try...')

r = 10 / int('2')

print('result:', r)

except valueerror as e:

print('valueerror:', e)

except zerodivisionerror as e:

print('zerodivisionerror:', e)

else:

print('no error!')

finally:

print('finally...')

print('end')

另外可以在except後面加乙個else,當沒有錯誤發生時,會自動執行else語句。

key point:

try:

foo()

except valueerror as e:

print('valueerror')

except unicodeerror as e:

print('unicodeerror')

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

def

foo(s):

return

10 / int(s)

defbar

(s):

return foo(s) * 2

defmain

():try:

bar('0')

except exception as e:

print('error:', e)

finally:

print('finally...')

若沒有try...except語句捕獲錯誤,當程式遇到錯誤時,沒有將錯誤一直想上拋,最後被python直譯器捕獲,列印出呼叫的堆疊後,再列印乙個錯誤資訊,然後程式退出

如果不捕獲錯誤,自然可以讓python直譯器來列印出錯誤堆疊,但程式也被結束了。既然我們能捕獲錯誤,就可以把錯誤堆疊列印出來,然後分析錯誤原因,同時,讓程式繼續執行下去。

logging模組可以非常容易的記錄錯誤資訊:

import logging

deffoo

(s):

return

10 / int(s)

defbar

(s):

return foo(s) * 2

defmain

():try:

bar('0')

except exception as e:

logging.exception(e)

main()

print('end')

同樣是出錯,但程式列印完錯誤資訊後會繼續執行,並正常退出。

通過配置,logging還可以把錯誤記錄到日誌檔案裡,方便事後排查。

fixme:raise

Learning Python 4 輸入引數

1.getopt最簡單粗暴直接有效的方法 usr bin python import sys print sys.argv 0 program name print sys.argv 1 first argvsys.argv 記錄命令列引數,但沒有sys.argc,可以通過len sys.argv ...

小公尺電視4a4c4x4s的區別

小公尺電視4a 55英吋延續了小公尺電視以往的簡約時尚風格英吋,採用黑色色彩為主,看起來經典又百搭 搭配64位四核處理器,配置2gb 8gb大儲存 搭載第6代畫質引擎,相比上一代有4處公升級,同步支援hdr10和hybrid log gamma。提供了更多的動態範圍和影象細節,使得暗部更暗,亮部更亮...

SpringMVC4 Hibernate4學習筆記

注 本文是以前幾篇部落格的簡單合併,未做更新 鑑於目前資料大多數都是基於spring3的配置,本人在最初搭建的時候遇到很多問題,由此記錄下來僅供參考 使用的jar檔案springframework4.0.6 為了方便整個先導入 hibernate4.3.6 required 下所有jar 以及 op...