目录
[raise :抛出异常](#raise :抛出异常)
[traceback.format_exc() :取得反向跟踪的字符串](#traceback.format_exc() :取得反向跟踪的字符串)
[assert :断言](#assert :断言)
[logging 日志模块](#logging 日志模块)
[logging.debug() 打印日志信息](#logging.debug() 打印日志信息)
[logging.disable(level) 禁用日志](#logging.disable(level) 禁用日志)
raise :抛出异常
使用raise语句抛出异常,raise 语句包含
• raise 关键字;
• 对 Exception 函数的调用;
• 传递给Exception 函数的字符串,包含有用的出错信息。
raise Exception("useful error messages..")
box_print.py
python
# exception
# throw out an exception
# 使用raise语句抛出异常
'''
结构: raise关键字 Exception("错误信息")
raise Exception("error messages...")
'''
def box_print(symbol, width, height) :
""" Printing a box acording to parameters """
# 校验参数
# symbol 参数的长度必须为1
if len(symbol) != 1 :
# 抛出异常
raise Exception("Symbol must be a single character string.")
# 宽度大于2
if width <= 2 :
raise Exception("Width must be greater than 2.")
# 高度大于2
if height <= 2 :
raise Exception("Height must be greater than 2.")
# 打印
print(symbol * width)
for i in range(height - 2) :
print(symbol, (" " * (width - 4)), symbol)
print(symbol * width)
def main() :
for sym, w, h in(("*", 4, 4), ("0", 20, 5), ("x", 1, 3), ("zz", 3, 3)) :
try:
box_print(sym, w, h)
except Exception as e:
print("An exception happened: ", str(e))
main()

traceback.format_exc() :取得反向跟踪的字符串
Python 遇到错误,就会生成一些错误信息,称为"反向跟踪"。
反向跟踪包含了出错消息 、导致该错误的代码行号 ,以及导致该错误的函数调用的序列("调用栈")
获取反向跟踪的字符串
traceback.format_exc()
def trace_back() :
raise Exception("This is an error message.")
trace_back()
反向跟踪如图

只要抛出的异常没有处理,python就会显示反向跟踪,可以调用trackback模块的format_exc()函数获取到反向跟踪的字符串,下面代码将获取到的字符串写入到文件
记得要先导入traceback模块
python
# 获取反向跟踪的字符串
# traceback.format_exc()
# 导入模块
import traceback
def trace_back() :
try :
raise Exception("This is an error message.")
except :
error_file = open("traceback_exp_log.txt", "w")
error_file.write(traceback.format_exc())
error_file.close()
print("The traceback info was written to error_file.txt")
trace_back()

assert :断言
"断言"是一个心智正常的检查,以确保代码没有做什么明显错误的事情。
如果assert 失败,程序就应该崩溃。通过这样的快速失败,来缩短产生缺陷和你第一次注意到该缺
陷之间的时间。将减少为寻找导致该缺陷的代码,而需要检查的代码量。
assert 语句包含
• assert 关键字;
• 条件(即求值为True 或False 的表达式);
• 逗号;
• 当条件为False 时显示的字符串。
assert door_status == 'open', 'The doors need to be "open".'如果 door_status == 'open'为false,就会输出后面 'The doors need to be "open".' 这句话
在交通灯模拟中使用断言
python
# 交通信号灯模拟程序。
# assert语句的应用
GREEN = "green"
RED = "red"
YELLOW = "yellow"
# Market街和第2街路口 ns 南北向 ew 东西向
market_2nd = {"ns": "green", "ew": "red"}
# Mission街和第16街路口 ns 南北向 ew 东西向
mission_16th = {"ns": "red", "ew": "green"}
def switch_light(stop_light) :
for key in stop_light.keys() :
# 绿灯变黄灯
if stop_light[key] == GREEN :
stop_light[key] = YELLOW
# 黄灯变红灯
if stop_light[key] == YELLOW :
stop_light[key] = RED
# 红灯变绿灯
if stop_light[key] == RED :
stop_light[key] = GREEN
# 断言这个路口是否有红灯,
# 如果没有红灯则抛出异常,表示心智正常检查失败:两个方向都没有红灯,意味着两个方向的车都可以走
assert RED in stop_light.values(), "Neither light is red!" + str(stop_light)
switch_light(market_2nd)

运行python时 加入参数 -O 即可禁止断言
logging 日志模块
使用日志模块需要先导入logging模块,并给定日志格式。需要写在程序顶部
logging.basicConfig()
导入模块
import logging
设置日志级别和格式
logging.basicConfig (filename ="myLog.txt", level =logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")
filename 将日志写入myLog.txt文件,文件不存在会自动创建
level 指定日志级别
format 设定日志记录哪些信息,及格式
日志级别
|----------|--------------------|---------------------------------|
| 级别 | 日志函数 | 描述 |
| DEBUG | logging.debug() | 最低级别。用于小细节。通常只有在诊断问题时,你才会关心这些消息 |
| INFO | logging.info() | 用于记录程序中一般事件的信息,或确认一切工作正常 |
| WARNING | logging.warning() | 用于表示可能的问题,它不会阻止程序的工作,但将来可能会 |
| ERROR | logging.error() | 用于记录错误,它导致程序做某事失败 |
| CRITICAL | logging.critical() | 最高级别。用于表示致命的错误,它导致或将要导致程序完全停止工作 |
python
# 日志级别
import logging
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")
def def_level_print() :
logging.debug('Some debugging details.')
logging.info('The logging module is working.')
logging.warning('An error message is about to be logged.')
logging.error('An error has occurred.')
logging.critical('The program is unable to recover!')
def_level_print()

logging.debug() 打印日志信息
logging.debug(),logging.info(), logging.warning(),logging.error(),logging.critical()用于打印不同级别的日志信息
debug() 、info()等这些函数会调用basicConfig(),打印一行信息。信息的格式是我们在basicConfig()函数中指定的。
示例: 使用日志打印阶乘
python
# 使用日志debug打印阶乘
import logging
logging.basicConfig(filename="myLog.txt", 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.disable(level) 禁用日志
入参level是一个日志级别,disable()会禁止该级别和更低级别的所有日志消息。
logging. disable(logging.CRITICAL)会禁用所有日志。
记录一下错误(犯过两次了)
如果出现了一下错误,请先检查一下你的文件名是否与"logging"重名了!!改个名字就好了
AttributeError: partially initialized module 'logging' has no attribut 'basicConfig' (most likely due to a circular import
