10、调试


10.1抛出异常


抛出异常相当于“停止运行这个函数中的代码,将程序执行转到except语句”


raise语句包含:
1、raise关键字
2、对Exception函数的调用
3、传递给Exception函数的字符串,包含有用的出错信息


如果没哟try和except语句覆盖抛出异常的raise语句,程序就会奔溃


常常raise语句在一个函数中,try和except语句在调用函数代码


例子1、
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 s,w,h in (('*',4,4),('0',20,5),('X',1,3),("zz",4,4)):
    try:
        boxPrint(s,w,h)
    except Exception as err:
        print("An exception happened:"+str(err))






反响跟踪的字符串


可以通过traceback.format_exc()得到它的字符串形式




>>> import traceback,os
>>> os.chdir('C:\\Users\\Nick\\Desktop\\python\\drawing\\2')
>>> try:
    raise Exception('This is the error message.')
except:
    errorFile = open('errorInfo.txt','a')
    errorFile.write(traceback.format_exc())
    errorFile.close()
    print('The traceback info was written to errorInfo.txt.')


    
115
The traceback info was written to errorInfo.txt.




10.3断言
“断言”是个心智正常的检查,确保代码没有做明显 错误的事情,如果检查失败就会抛出异常
1、assert关键字,
2、条件(即求值为True或False的表达式)
3、逗号
4、当条件为False时显示的字符串


>>> podBat = 'open'
>>> assert podBat == 'open','The pod bat door need open!'
>>> podBatOne = 'close'
>>> assert podBatOne == 'open','The pod bat door need open!'
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    assert podBatOne == 'open','The pod bat door need open!'
AssertionError: The pod bat door need open!






10.4日志


导入logging模块
程序首行添加:
logging.basicConfig(level = logging.DEBUG,format = '%(asctime)s - %(levelname)s - %(message)s')


日志级别:
1、DEBUG, 日志函数logging.debug(),最低级别,用于小细节,通常只有在诊断问题时,你才会关心这些信息
2、INFO, 日志函数logging.info(),用于记录程序中的一半事件的信息,或确认一切工作正常
3、WARNING, 日志函数logging.warning(),用于表示可能的问题,它不会阻止程序的工作,但将来可能会
4、ERROR, 日志函数logging.error(),用于记录错误,它导致程序做某事失败
5、CRITICAL, 日志函数logging.critical(),最高级别,用于表示致命的错误,它导致或将要导致程序完全停止工作


>>> import logging
>>> logging.basicConfig(level = logging.DEBUG,format = '%(asctime)s - %(levelname)s - %(message)s')
>>> logging.debug('Some debugging details.')
2017-04-20 09:46:03,535 - DEBUG - Some debugging details.
>>> logging.info('Some debugging details.')
2017-04-20 09:46:20,820 - INFO - Some debugging details.
>>> logging.warning('Some debugging details.')
2017-04-20 09:46:35,888 - WARNING - Some debugging details.
>>> logging.error('Some debugging details.')
2017-04-20 09:46:44,180 - ERROR - Some debugging details.
>>> logging.critical('Some debugging details.')
2017-04-20 09:46:57,692 - CRITICAL - Some debugging details.


日志级别只是一种建议,归根结底还是需要用户自己来设置日志消息属于哪一种类型


在完成调试程序后,不希望所有日志信息显示在屏幕上,logging.disable()函数禁用这些信息,
只要向logging.disable()传入一个日志级别,它就会禁止该级别和更低级别的所有日志信息
如果想禁止所有日志信息:logging.disable(logging.CRITICAL)






将日志记录到文件


除了将日志信息打印在屏幕上,还能将他们写入文本文件,logging.basicConfig()函数接受filename关键字参数,将日志信息存入文本
>>> import logging
>>> logging.basicConfig(filename = 'myProgramLog.txt',level = logging.DEBUG,format = '%(asctime)s - %(levelname)s - %(message)s')

本文转载:CSDN博客