【python调试】异常抛出、重定向、断言机制

一、异常

- 异常抛出

'''
正常情况下,当python程序尝试执行无效代码时,就会抛出异常
这些异常都是程序提前定义好的,我们可以用try-except来对异常进行处理
而实际上我们也可以在程序中人为的抛出异常,并结合try-except在制造人为的异常处理
'''
test_number=input("请输入一个大于2的字:")
if test_number<=2:
    # 使用raise来人为抛出异常
    raise Exception("数字小于2!")
else:
    print(test_number)
'''
此种情况下:程序会终止并抛出异常Exception,具体如下:

Traceback (most recent call last):
  File "D:/编程/rumen-10.py", line 6, in <module>
    raise Exception("数字小于2!")
Exception: 数字小于2!
'''
'''
此时,可以结合try-exception来处理程序
'''
try:
    test_number=int(input("请输入一个大于2的字:"))
    if test_number<=2:
        # 使用raise来认为抛出异常
        raise Exception("数字小于2!")
    else:
        print(test_number)
except Exception:
    print("数字输入不符合要求")
'''
此时,程序不会抛出异常,回显如下:

请输入一个大于2的字:2
数字输入不符合要求
'''

- 异常重定向

'''
通常,程序抛出异常时,会终止程序,并显示异常相关信息
而一般情况下我们使用try-exception避免异常抛出直接导致的程序崩溃
这里再介绍一种异常重定向的方法,也可避免异常抛出直接导致的程序崩溃。
通过使用traceback.format_exc将异常重定向为字符串
同时,可再将该字符串写入一个文本文件中,用于后续日志查询定位。
'''
try:
    # 手动制造异常
    raise Exception("This is a exception")
except Exception:
    error_file=open(r"test\error.txt","w")
    # traceback.format_exc将异常重定向为字符串,并写入error_file文件中
    error_file.write(traceback.format_exc())
    error_file.close()

- 断言

'''
python程序中,我们可以使用print语句来排查程序中的bug,而此种方式在程序回显内容过多时较为麻烦
此时,我们可以使用python中的断言机制来判断程序中是否存在bug(检查不通过会抛出异常)
通过  assert 判断真假(True or False),回显内容字符串  的格式,
当判断真假为真(True),则不会抛出异常
当判断真假为假(False),则抛出AssertionError异常,并显示"回显内容字符串"

'''
# 假定程序中podBayDoorStatus的值应为open,而实际赋值也为open,故这里断言检测通过,不会抛出异常
podBayDoorStatus = 'open'
assert podBayDoorStatus == 'open', 'The pod bay doors need to be "open".'

# 假定程序中podBayDoorStatus的值应为open,而实际赋值不为open,故这里断言检测不通过,会抛出异常AssertionError,且后面的提示语为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".'
'''
回显如下,抛出AssertionError,且会显示assert语句最后编辑的字符串作为提示:

Traceback (most recent call last):
  File "D:/编程/rumen-10.py", line 33, in <module>
    assert podBayDoorStatus == 'open', 'The pod bay doors need to be "open".'
AssertionError: The pod bay doors need to be "open".
'''

二、日志

- logging日志模块

'''
使用logging日志模块显示调测日志
'''
import logging
# 为日志模块配置基础信息,这里将日志格式定为 时间-日志级别-消息 ,最低可显示的级别定为DEBUG
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s- %(message)s')
# 使用logging.debug显示debug类消息
logging.debug('Start of program')
# 使用logging.error显示error类消息
logging.error("a error occur")
'''
回显如下,会按照预先定义好的格式显示:
 2018-07-08 21:20:49,110 - DEBUG- Start of program
 2018-07-08 21:20:49,110 - ERROR- occur
'''
'''
使用logging模块完全可以替代print()的传统方式,并且其优点在于使用一条logging.disable()就可以禁用日志的记录与显示
'''
# 禁用日志功能,CRITICAL为最高级别日志类别,所以所有的日志都会被禁用
# 该语句应该放在其它所有logging语句之前
logging.disable(logging.CRITICAL)

- 日志级别

级别 日志函数 级别(1最低)
DEBUG logging.debug() 1
INFO logging.info() 2
WARNING logging.warning() 3
ERROR logging.error() 4
CRITICAL logging.critical() 5

- 将日志记录到文件

import logging
# 使用filename参数指定日志文件位置,相关日志默认会以"a"(附加)的方式存在一个文本文件中,此时显示栏不再显示日志信息。
logging.basicConfig(filename=r"test\error.txt", level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

猜你喜欢

转载自blog.csdn.net/huihuihhh/article/details/80962422