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')
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')