1.抛出异常
抛出异常使用raise 语句。在代码中,raise 语句包含以下部分:
- raise 关键字;
- 对Exception 函数的调用;
- 传递给Exception 函数的字符串,包含有用的出错信息。
raise Exception('This is the error message.')
通常是调用该函数的代码知道如何处理异常,而不是该函数本身。所以你常常会看到raise 语句在一个函数中,try 和except 语句在调用该函数的代码中。
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), ('O', 20, 5), ('x', 1, 3), ('ZZ', 3, 3)):
try:
boxPrint(sym, w, h)
except Exception as err:
print('An exception happened: ' + str(err))
程序使用了except 语句的except Exception as err 形式。如果boxPrint()返回一个Exception 对象,这条语句就会将它保存在名为err 的变量中。Exception 对象可以传递给str(),将它转换为一个字符串,得到用户友好的出错信息。
使用try 和except 语句,你可以更优雅地处理错误,而不是让整个程序崩溃。
2.取得反向跟踪的字符串
如果Python 遇到错误,它就会生成一些错误信息,称为“反向跟踪”。反向跟踪包含了出错消息、导致该错误的代码行号,以及导致该错误的函数调用的序列。这个序列称为“调用栈”。
只要抛出的异常没有被处理,Python 就会显示反向跟踪。调用traceback.format_exc()
得到它的字符串形式。如果你希望得到异常的反向跟踪的信息,但也希望except 语句优雅地处理该异常,这个函数就很有用。在调用该函数之前,需要导入Python 的traceback 模块。
例如,不是让程序在异常发生时就崩溃,可以将反向跟踪信息写入一个日志文件,并让程序继续运行。稍后,在准备调试程序时,可以检查该日志文件
import traceback
try:
raise Exception('This is the error message.')
except:
errorFile = open('errorInfo.txt', 'w')
errorFile.write(traceback.format_exc())
errorFile.close()
print('The traceback info was written to errorInfo.txt.')
write() 方法的返回值是116,因为116 个字符被写入到文件中。反向跟踪文本被写入errorInfo.txt。
3.断言
assert语句包含以下部分:
- assert 关键字;
- 条件(即求值为True 或False 的表达式);
- 逗号;
- 当条件为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".'
这里将podBayDoorStatus 设置为 ‘open’,所以从此以后,我们充分期望这个变量的值是 ‘open’。在使用这个变量的程序中,基于这个值是 ‘open’ 的假定,我们可能写下了大量的代码,即这些代码依赖于它是 ‘open’,才能按照期望工作。所以添加了一个断言,确保假定podBayDoorStatus 是 ‘open’ 是对的。这里,我们加入了信息 ‘Thepod bay doors need to be “open”.’,这样如果断言失败,就很容易看到哪里出了错。稍后,假如我们犯了一个明显的错误,把另外的值赋给podBayDoorStatus,但在很多行代码中,我们并没有意识到这一点。这个断言会抓住这个错误,清楚地告诉我们出了什么错。
断言针对的是程序员的错误,而不是用户的错误。对于那些可以恢复的错误(诸如文件没有找到,或用户输入了无效的数据),请抛出异常,而不是用assert 语句检测它。
禁用断言
在运行Python 时传入-O 选项,可以禁用断言。如果你已完成了程序的编写和测试,不希望执行心智正常检测,从而减慢程序的速度,这样就很好(尽管大多数断言语句所花的时间,不会让你觉察到速度的差异)。断言是针对开发的,不是针对最终产品。当你将程序交给其他人运行时,它应该没有缺陷,不需要进行心智正常检查。
4.日志
- 使用日志模块
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(1,n + 1):
total *= i
logging.debug('i is ' + str(i) + ', total is ' + str(total))
logging.debug('End of factorial(%s%%)' % (n))
return total
print(factorial(5))
logging.debug('End of program')
想打印日志信息时,使用logging.debug()
函数。这个debug() 函数将调用basicConfig(),打印一行信息。这行信息的格式是我们在 basicConfig()函数中指定的,并且包括我们传递给 debug() 的消息。print(factorial(5))调用是原来程序的一部分,所以就算禁用日志信息,结果仍会显示。
- 不要用print()调试
输入import logging 和logging.basicConfig(level=logging.DEBUG, format=’%(asctime)s - %(levelname)s %(message)s’)有一点不方便。 你可能想使用print() 调用代替,但不要屈服于这种诱惑!在调试完成后,你需要花很多时间,从代码中清除每条日志消息的print() 调用。你甚至有可能不小心删除一些print() 调用,而它们不是用来产生日志消息的。
日志消息的好处在于,你可以随心所欲地在程序中想加多少就加多少稍后只要加入一次数logging.disable(logging.CRITICAL)
调用,就可以禁止日志。不像print(),logging 模块使得显示和隐藏日志信息之间的切换变得很容易。
日志消息是给程序员的,不是给用户的。用户不会因为你便于调试,而想看到的字典值的内容。请将日志信息用于类似这样的目的。对于用户希望看到的消息,例如“文件未找到”或者“无效的输入,请输入一个数字”,应该使用print() 调用。我们不希望禁用日志消息之后,让用户看不到有用的信息。
- 日志级别
“日志级别”提供了一种方式,按重要性对日志消息进行分类。5 个日志级别,从最不重要到最重要。利用不同的日志函数,消息可以按某个级别记入日志。
日志消息作为一个字符串,传递给这些函数。日志级别是一种建议。归根到底,还是由你来决定日志消息属于哪一种类型。
-
禁用日志
在调试完程序后,你可能不希望所有这些日志消息出现在屏幕上。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')
日志信息将被保存到myProgramLog.txt 文件中。虽然日志消息很有用,但它们可能塞满屏幕,让你很难读到程序的输出。将日志信息写入到文件,让屏幕保持干净,又能保存信息,这样在运行程序后,可以阅读这些信息。
来源:CSDN
作者:幽冥之花
链接:https://blog.csdn.net/qq_30011277/article/details/103803006