天天看点

调试

抛出异常

当python试图执行无效代码时,就会抛出异常。

可以使用try和except语句来处理python的异常,让程序从预期的异常中恢复。

可以在代码中抛出异常,“停止运行这个函数中的代码,将程序执行转到except语句"。

抛出异常使用raise语句。如果没有try和except语句覆盖抛出异常的raise语句,该程序就会崩溃,并显示异常的出错信息。

使用try和except语句,可以更优雅的处理错误,而不是让整个程序崩溃。

通常是调用该函数的代码知道如何处理异常,而不是该函数本身。

>>> raise Exception('This is a exception message.')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: This is a exception message.      
>>> try:
...     guessOne(99)
... except Exception as err:
...     print('Exception message: '+str(err))
...
Exception message: name 'guessOne' is not defined      

反向跟踪

如果python遇到错误,它会生成一些错误信息,称为”反向跟踪“。反向跟踪包含了出错消息、导致该错误的代码行号,以及导致该错误的函数调用的序列。这个序列称为”调用栈“。

只要抛出的异常没有被处理,python就会显示反向追踪。可以调用traceback.format_exc(),得到它的字符串形式。在调用该函数之前,需要导入traceback模块。

[root@juispan tmp]# cat 1.py
def a():
        b()
def b():
        raise Exception('ERROR!!!')
a()
[root@juispan tmp]# python3 1.py
Traceback (most recent call last):
  File "1.py", line 5, in <module>
    a()
  File "1.py", line 2, in a
    b()
  File "1.py", line 4, in b
    raise Exception('ERROR!!!')
Exception: ERROR!!!      

断言

断言的检查,确保代码没有做出什么明显错误的事情。

断言会抓住错误,清楚的告诉我们出了什么错。

assert语句是说:”我断言这个条件为真,如果不为真,程序中什么地方就有一个缺陷。“

不像异常,代码不应该用try和except处理assert语句。

断言针对的是程序员的错误,而不是用户的错误。对于那些可以恢复的错误,请抛出异常,而不是用assert语句检测它。

在运行python时传入-O选项,可以禁用断言,从而稍稍提高性能。如python -O test.py

>>> door='open'
>>> assert door == 'open','abnormal.'
>>> door='shut'
>>> assert door == 'open','abnormal.'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: abnormal.      

日志

使用python的logging模块很容易创建自定义的消息记录。

这些日志消息将描述程序执行何时到达日志函数调用,并列出指定的任何变量当时的值。另一方面,缺失日志信息表明有一部分代码被跳过,从未执行。

当python记录一个事件的日志时,它会创建一个LogRecord对象,保存关于该事件的信息。logging模块的函数指定想要看到的这个LogRecord对象的细节,以及希望的细节展示方式。

不要用print()调试,删除时容易误操作。

加入一条logging.disable(l)调用,就可以禁止日志。它将禁用它之后的所有消息。可以加在import logging之后,通过注释和取消注释,启用或禁用它。

要启用logging模块,可以执行以下代码:

import logging
logging.basicConfig(filename='mylog.txt',level=logging.DEBUG,format=' %(asctime)s - %(levelname)s - %(message)s')        ##如果不需要存入文件,可取消传递filename参数      

当我们向打印日志信息时,使用logging.debug()函数。这个debug()函数将调用basicConfig(),打印一行信息。信息的格式在basicConfig()函数中指定,包括传递给debug()的消息。

级  别 模块函数 作  用
DEBUG  logging.debug()  最低级别。用于小细节。通常用于诊断问题。
INFO  logging.info() 用于记录程序中的一般事件的信息,或确认一切工作正常。
WARNING logging.warning() 用于表示可能的问题,它不会阻止程序的工作,但将来可能会。
ERROR  logging.error()  用于记录错误,它导致程序做某事失败。
CRITICAL  logging.critical() 最高级别。用于表示致命的错误,它导致或将要导致程序完全停止工作。
[root@juispan tmp]# cat 1.py
import logging
logging.basicConfig(level=logging.DEBUG,format=' %(asctime)s - %(levelname)s - %(message)s')
#logging.disable(logging.DEBUG)
logging.debug('start')
def sum(a,b):
        count=0
        for num in range(a,b+1):
                count+=num
                logging.debug('Now sum is: '+str(count))
sum(5,10)
logging.debug('end')
[root@juispan tmp]# python3 1.py
 2017-07-21 01:58:44,200 - DEBUG - start
 2017-07-21 01:58:44,200 - DEBUG - Now sum is: 5
 2017-07-21 01:58:44,200 - DEBUG - Now sum is: 11
 2017-07-21 01:58:44,200 - DEBUG - Now sum is: 18
 2017-07-21 01:58:44,200 - DEBUG - Now sum is: 26
 2017-07-21 01:58:44,200 - DEBUG - Now sum is: 35
 2017-07-21 01:58:44,200 - DEBUG - Now sum is: 45
 2017-07-21 01:58:44,200 - DEBUG - end
[root@juispan tmp]# cat 1.py
import logging
logging.basicConfig(level=logging.DEBUG,format=' %(asctime)s - %(levelname)s - %(message)s')
logging.disable(logging.DEBUG)           ##关闭debug日志
logging.debug('start')
def sum(a,b):
        count=0
        for num in range(a,b+1):
                count+=num
                logging.debug('Now sum is: '+str(count))
sum(5,10)
logging.debug('end')
[root@juispan tmp]# python3 1.py      
上一篇: 调试
下一篇: 调试

继续阅读