在程式執行過程中,總會遇到各種各樣的錯誤。
有的錯誤是程式編寫有問題造成的,比如本來應該輸出整數結果輸出了字串,這種錯誤我們通常稱之為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...