抛出异常
当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