1. 程式人生 > >python學習-基礎-錯誤、除錯、測試

python學習-基礎-錯誤、除錯、測試

  1. 錯誤處理

# 在程式執行的過程中,如果發生了錯誤,可以事先約定返回一個錯誤程式碼,這樣,就可以知道是否有錯,以及出錯的原因
# 
# # 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(),就可以設定一個斷點:
#