1. 程式人生 > >python自動化之調試

python自動化之調試

調用棧 character 自動 asi 細節 記錄 total 程序 eight

#####調試

#####查看日誌與斷言

‘‘‘

拋出異常使用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自動化之調試