Python - 调试

目录

[raise :抛出异常](#raise :抛出异常)

[traceback.format_exc() :取得反向跟踪的字符串](#traceback.format_exc() :取得反向跟踪的字符串)

[assert :断言](#assert :断言)

[logging 日志模块](#logging 日志模块)

logging.basicConfig()

日志级别

[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

相关推荐
沐雪轻挽萤6 小时前
15. C++17新特性-std::string_view
java·开发语言·c++
Polar__Star6 小时前
Go语言中--=运算符详解:位右移赋值操作的原理与实践
jvm·数据库·python
不考研当牛马6 小时前
python 第21课 基础完结(UDP套接字)
开发语言·python·udp
qq_189807036 小时前
Navicat导出JSON数据为空如何解决_过滤条件与权限排查
jvm·数据库·python
2301_813599556 小时前
HTML表单能嵌套吗_表单嵌套限制与替代方案【解答】
jvm·数据库·python
wearegogog1236 小时前
光伏发电系统最大功率跟踪(MPPT)算法 Matlab 实现指南
开发语言·算法·matlab
yejqvow126 小时前
如何使用可视化查询生成器_免敲代码的多表JOIN配置
jvm·数据库·python
小小码农Come on6 小时前
QML怎么使用C++多线程编程
开发语言·c++
2301_815279526 小时前
学生党预算有限怎么选HTML函数工具_低配高性价比教程【教程】
jvm·数据库·python
devilnumber6 小时前
java的NIO框架Netty、Mina、Grizzly 和 Jetty 四种对比
java·nio·java面试·jetty