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

相关推荐
代码探秘者2 小时前
【算法篇】6.分治
java·数据结构·后端·python·算法·排序算法
Elastic 中国社区官方博客2 小时前
我们如何修复 OpenTelemetry 中基于 head 的采样
大数据·开发语言·python·elasticsearch·搜索引擎
20岁30年经验的码农2 小时前
Java NIO底层实现原理
开发语言·php
biubiubiu07062 小时前
Spring Boot 中如何自定义一个 Starter
java·spring boot·后端
15Moonlight2 小时前
Java基础篇
java·intellij-idea
鸽鸽程序猿2 小时前
【JavaEE】【SpringAI】图像模型与语音模型
java·java-ee
飞鱼计划2 小时前
EasyExcel 3.3.2 模板方式写入数据完整指南
java·开发语言
梦因you而美2 小时前
Python自动化复制Excel sheet表(openpyxl+win32com双方案,完美保留格式)
python·自动化·excel·win32com·openpyxl
执 、2 小时前
PageHelper 插件实现分页查询
java·sql