python學習-基礎-錯誤、除錯、測試
阿新 • • 發佈:2019-01-14
# 在程式執行的過程中,如果發生了錯誤,可以事先約定返回一個錯誤程式碼,這樣,就可以知道是否有錯,以及出錯的原因 # # # try # 當我們認為某些程式碼可能會出錯時,就可以用try來執行這段程式碼,如果執行出錯,則後續程式碼不會繼續執行,而是直接跳轉至錯誤處理程式碼,即except語句塊, # 執行完except後,如果沒有錯誤發生,可以在except語句塊後面加一個else,當沒有錯誤發生時,會自動執行else語句,如果有finally語句塊,則執行finally語句塊,至此,執行完畢。 # ValueError ZeroDivisionError try: print('try...') r = 10 / 2 print('result:', r) except Exception as e: print('except:', e) else: print('no error!') finally: print('finally...') print('END') #使用try...except捕獲錯誤還有一個巨大的好處,就是可以跨越多層呼叫,所有不需要在每個可能出錯的地方去捕獲錯誤,只要在合適的層次去捕獲錯誤就可以了 # #呼叫棧 #如果錯誤沒有被捕獲,它就會一直往上拋,最後被Python直譯器捕獲,列印一個錯誤資訊,然後程式退出。 # # 記錄錯誤 # 既然我們能捕獲錯誤,就可以把錯誤堆疊打印出來,然後分析錯誤原因,同時,讓程式繼續執行下去。 # Python內建的logging模組可以非常容易地記錄錯誤資訊: # 通過配置,logging還可以把錯誤記錄到日誌檔案裡,方便事後排查。 import logging def foo(s): return 10 / int(s) def bar(s): return foo(s) * 2 def main(): try: bar('0') except Exception as e: logging.exception(e) main() print('END') # 這裡最終會執行, # 丟擲錯誤 # 首先根據需要,可以定義一個錯誤的class,選擇好繼承關係,然後,用raise語句丟擲一個錯誤的例項: class FooError(ValueError): pass def foo1(s): n = int(s) if n==0: raise FooError('invalid value: %s' % s) return 10 / n foo1('0') # 如果可以選擇Python已有的內建的錯誤型別(比如ValueError,TypeError),儘量使用Python內建的錯誤型別 # 捕獲錯誤目的只是記錄一下,便於後續追蹤。但是,由於當前函式不知道應該怎麼處理該錯誤,所以,最恰當的方式是繼續往上拋,讓頂層呼叫者去處理。 # # 除錯 # # print() 列印 # assert 斷言 # assert n != 0, 'n is zero!' 如果斷言失敗,assert語句本身就會丟擲AssertionError: # logging # 它允許你指定記錄資訊的級別,有debug,info,warning,error等幾個級別 # 新增配置logging.basicConfig(level=logging.INFO) # logging.info() # pdb # 第4種方式是啟動Python的偵錯程式pdb,讓程式以單步方式執行 # python -m pdb err.py # pdb.set_trace() # 這個方法也是用pdb,但是不需要單步執行,我們只需要import pdb,然後,在可能出錯的地方放一個pdb.set_trace(),就可以設定一個斷點: #