python自動化之調試
#####調試
#####查看日誌與斷言
‘‘‘
拋出異常使用raise語句.在代碼中,raise語句包含以下部分:
(1)raise關鍵字;
(2)對Exception函數的調用;
(3)傳遞給Exception函數的字符串,包含有用的出錯信息
‘‘‘
###########################################拋出異常####################################
def boxPrint(symbol,width,height):
if len(symbol)!=1:
raise Exception(‘Symbol must be a single character string.‘)
if width<=2:
raise Exception(‘Width must be greater than 2.‘)
if height<=2:
raise Exception(‘Height must be greater than 2.‘)
print(symbol*width)
for i in range(height-2):
print(symbol+(‘ ‘*(width-2))+symbol)
print(symbol*width)
for sym,w,h in ((‘*‘,4,4),(‘0‘,20,5),(‘x‘,1,3),(‘ZZ‘,3,3)):
try:
boxPrint(sym,w,h)
except Exception as err:
print(‘An exception happened: ‘+str(err))
#######################################取得反向跟蹤的字符串####################################
‘‘‘
反向跟蹤包含了出錯信息、導致該錯誤的代碼行號,以及導致該
錯誤的函數調用的序列.這個序列稱為“調用棧”
‘‘‘
‘‘‘
調用traceback.format_exc(),得到拋出異常的字符串形式.
可以將反向跟蹤信息寫入一個日誌文件,並讓程序繼續運行
‘‘‘
import traceback
try:
raise Exception(‘This is the error message.‘)
except:
errorFile=open(‘errorInfo.txt‘,‘w‘)
errorFile.write(traceback.former_exc())
errorFile.close()
print(‘The traceback info was written to errorInfo.txt.‘)
#######################################斷言####################################
‘‘‘
"斷言"是一個心智正常的檢查,確保代碼沒有做什麽明顯錯誤的事.
這些心智正常的檢查由assert語句執行.如果檢查失敗,就會拋出異常
assert語句包含以下部分:
(1)assert關鍵字;
(2)條件(即求值為);
(3)逗號;
(4)當條件為False時顯示的字符串
‘‘‘
podBayDoorStatus=‘open‘
assert podBayDoorStatus==‘open‘,‘The pod bay doors need to be "open".‘
podBayDoorStatus=‘I \‘m sorry,Dave.I \‘m afraid I can\‘t do that.‘
assert podBayDoorStatus==‘open‘,‘The pod bay doors need to be "open".‘
#######################################禁用斷言#######################################
‘‘‘
在運行Python時傳入-O選項,可以禁用斷言
‘‘‘
#######################################日誌###########################################
‘‘‘
Python的logging模塊使得你很容易創建自定義的消息記錄.
這些日誌消息將描述程序執行何時到達日誌函數調用,
並列出你指定的任何變量當時的值.
另一方面,缺失日誌信息表明有一部分代碼被跳過,從未執行
‘‘‘
#######################################使用日誌模塊###################################
‘‘‘
要啟用logging模塊,在程序運行時將日誌信息顯示在屏幕上,
請將下面的代碼復制到程序頂部(但在Python的#!行之下)
‘‘‘
import logging
logging.basicConfig(level=logging.DEBUG,format=‘ %(asctime)s-%(levelname)s-%(message)s‘)
‘‘‘
當Python記錄一個事件的日誌時,它會創建一個LogRecord對象,保存關於該事件的信息.
logging模塊的函數讓你指定想看到的這個LogRecord對象的細節,以及希望的細節展示
方式.
‘‘‘
import logging
logging.basicConfig(level=logging.DEBUG,format=‘%(asctime)s-%(levelname)s-%(message)s‘)
logging.debug(‘Start of program‘)
def factorial(n):
logging.debug(‘Start of factorial (%s%%)‘%(n))
total=1
for i in range(n+1):
total*=i
logging.debug(‘i is ‘+str(i)+‘,total is ‘+str(total))
logging.debug(‘End of factorial (%s%%)‘%(n))
print(factorial(5))
logging.debug(‘End of program‘)
‘‘‘
logging.debug()調用不僅打印出傳遞給它的字符串,而且包含一個時間戳和單詞DEBUG
‘‘‘
#######################################不要用print()調試###################################
‘‘‘
1、每次清楚print()調用,可能刪除了不是用來產生日誌消息的
2、日誌消息好處:可以隨心所欲地在程序中想加多少就加多少,稍後
只要加入一次logging.disable(logging.CRITICAL)調用,就可以禁止日誌
‘‘‘
#######################################日誌級別###################################
‘‘‘
Python中的日誌級別(從最不重要到最重要)
級別 日誌函數 描述
DEBUG logging.debug() 最低級別.用於小細節,通常只有在診斷問題時,才會關心這些消息
INFO logging.info() 用於記錄程序中一般事件的消息,或確認一切工作正常
WARNING logging.warning() 用於表示可能的問題,它不會阻止程序的工作,但將來可能會
ERROR logging.error() 用來記錄錯誤,它導致程序做某事失敗
CRITICAL logging.critical() 最高級別.用來表示致命的錯誤,它導致或將要導致程序完全停止工作
‘‘‘
‘‘‘
日誌級別的好處是:可以改變想看到的日誌消息的優先級
向basicConfig()函數傳入logging.DEBUG,將顯示所有日誌級別的消息
傳入logging.error,將只顯示ERROR和CRITICAL消息,跳過DEBUG、INFO和WARNING消息
‘‘‘
#######################################禁用日誌###################################
‘‘‘
logging.disable()函數禁用日誌信息,只要向logging.disable()傳入一個日誌級別
它就會禁止該級別和更低級別的所有日誌消息.如果想要禁用所有日誌,只要在程序中
添加logging.disable(logging.CRITICAL)
‘‘‘
import logging
logging.basicConfig(level=logging.INFO,format=‘%(asctime)s-%(levelname)s-%(message)s‘)
logging.critical(‘Critical error!Critical error!‘)
logging.disable(logging.CRITICAL)
logging.critical(‘Critical error!Critical error!‘)
logging.error(‘Error!Error!‘)
##################################將日誌記錄到文件###################################
import logging
logging.basicConfig(filename=‘myProgramLog.txt‘,level=logging.DEBUG,format=‘%(asctime)s-%(levelname)s-%(message)s‘)
##################################調試###################################
‘‘‘
GO、Step、Over、Out、Quit:
Step按鈕讓調試器進入函數調用
Over按鈕將快速執行函數調用,不會單步進入其中
Out按鈕將快速執行余下的代碼,直到走出當前所處的函數
Go:調試器將在程序末尾或斷點處停止
‘‘‘
‘‘‘
寫assert語句,如果變量spam是一個小於10的整數,就觸發AssertionError
1、assert(spam>=10,‘The spam variable is less than 10.‘)
寫assert語句,如果eggs和bacon包含的字符串相同,而且不論大小寫,就觸發AssertionError
2、assert(eggs.lower()!=bacon.lower(),‘The eggs and bacon variables are the same!‘)
寫assert語句,總是觸發AssertionError
3、assert(False,‘This assertion always triggers.‘)
‘‘‘
python自動化之調試