我们日常写代码过程中,难免会写出各类错误,这些错误可能是语法错误、逻辑错误或运行时错误。我们可以使用最复杂的答案是来检测到错误。也可以通过仔细阅读回溯、使用调试工具、使用 linters 进行静态分析以及运行测试来检测错误,确保在运行之前和运行期间识别问题。
1.使用print语句进行调试
使用print语句进行调试就像在你要去的路上放置路标,我个人在我的隐喻中相信这一点
就像路标引导你并告诉你身在何处一样,代码中的打印语句会显示变量的当前值以及程序执行到的位置。
通过检查这些“路标”,你可以确定自己是否走在正确的道路上或是否出了问题。
print(f"Hello, World!\n");
在代码的关键点插入print()语句以输出变量值并跟踪执行流程。这可以帮助你了解不同阶段发生的情况。
例如:
我们在行中使用了print语句作为路径(代码流)上的路标,告诉你你在哪里以及发生了什么。如果出现问题,你可以使用这些检查点来找出路径(代码)将你引入歧途的地方。
def hiking_trip(start, destination):
print(f"从{start}开始徒步。") # 路标 1
midpoint = (start + destination) / 2
print(f"到达中点:{midpoint}.") # 路标 2
if midpoint > 50:
print("The midpoint is quite far!") # 路标 3
print(f"继续前往目的地:{destination}.") # 路标 4
return destination
hiking_trip(0, 100)
2.利用Python的内置pdb模块
使用 Python 的pdb模块就像暂停电影并逐帧播放。
就像你可以暂停、倒带或快进电影来查看正在发生的事情一样,pdb 可让你随时暂停代码,检查正在发生的事情,并一步一步地浏览代码。这样,你可以仔细检查代码的每个部分,以找出可能出错的地方。
使用该pdb模块设置断点并以交互方式逐步执行代码。首先插入import pdb; pdb.set_trace()要暂停执行的位置。
命令
python -m pdb your_script.py
例如:
例如,通过添加pdb.set_trace()到你的程序中,执行将在该行停止,从而允许你与提示符进行交互pdb。一旦到达提示符。
import pdb
def example_function(x, y ):
result = x + y
pdb.set_trace() # 执行将在此处暂停
print(f"结果是{result}")
return result
example_function(3, 5)
你可以使用各种命令来调试,例如:
n:转到下一行代码。s:进入函数调用。c:继续执行,直到下一个断点。
3.利用IDE调试器
使用 IDE 调试器就像在观看电影时拥有一个具有高级功能的遥控器。
你可以暂停、跳过场景并查看幕后细节,IDE 调试器可以让你设置断点、检查变量并以可视化的方式控制代码流程。
利用 PyCharm 或 VSCode 等 IDE 中的内置调试器。这些工具提供了用于设置断点、检查变量和逐步执行代码的图形界面。
例如:
在 PyCharm 或 VSCode 等 IDE 中调试程序时,你可以在代码中所需的关键点设置断点,类似于在重要场景暂停电影。随时彻底检查变量,就像看到电影幕后的细节一样。一次执行一行代码,就像使用遥控器在电影中逐帧跳过一样。
def movie_scene(start, end):
scene_duration = end - start # 这是代码的“电影长度”
important_event = start + scene_duration // 2 #“电影”的中点
return f"重要事件发生在{important_event}秒。"
movie_scene( 0 , 120 )
当调试器暂停执行时,你将能够执行以下命令:
检查start和end的值。看看scene_duration评估结果是什么。跨到下一行进行计算important_event。
4.利用日志记录获取更好的洞察力
使用日志记录而不是打印语句就像保存详细的日记而不是便签。
如果你需要快速记账,可以使用打印语句,它可以像便签一样工作,便签可以为你提供快速提醒,而日记(记录)可以让你记录不同级别的细节,从随意的观察到关键问题。
日志记录稍微复杂一些。你可以根据日志的重要性查看它们,并调整要查看的详细信息,从而帮助你更系统地跟踪代码中发生的情况。
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug('这是一条调试消息')
用 Python 的模块替换print()语句logging。日志可以记录不同级别的消息(DEBUG、INFO、WARNING、ERROR、CRITICAL),并控制显示的详细信息量。例如:
DEBUG:详细信息,用于诊断问题。INFO:确认一切如预期进行。WARNING:表示发生了意外的事情,但是程序仍然在运行。ERROR:更严重的问题,程序可能无法继续运行。CRITICAL:一个严重的问题,意味着该程序可能无法继续运行。
import logging
# 配置日志记录以显示所有级别
logstash.basicConfig(level=logging.DEBUG)
def hill_log ( start, destination ):
logstash.info(f"从{start}开始徒步到{destination}。") # 正常流程的 INFO 级别
midpoint = (start + destination) / 2
logstash.debug(f"中点在{midpoint}。") # 详细信息的 DEBUG 级别
if midpoint > 50 :
logstash.warning("中点比预期的远!") # 潜在问题的 WARNING 级别
if destination - start > 100 :
logstash.error("这次徒步太长了!") # 重大问题的错误级别
if destination - start > 200 :
logstash.critical("不可能徒步!目的地太远!") # 严重问题的 CRITICAL 级别
return destination
hill_log(0, 250)
在此示例中,你可以看到每个日志级别如何更加井然有序,并帮助你根据重要性显示信息,就像日记一样,它能让你理清自己的旅程。此外,它还能让你随时筛选或查看日志,print这比在代码中到处写语句(便签)要强大得多。我强烈推荐初学者使用这个!
5.仔细检查回溯
仔细检查回溯就像跟着地图去寻找你在徒步旅行中迷路的地方一样。
地图(回溯)显示你所走的确切路径,并突出显示出错的地方。通过在地图上仔细追溯你的步骤,你可以准确地找出错误发生的位置并了解导致错误的原因,从而帮助你回到正轨。
仔细阅读错误消息的完整回溯。它们提供了有关错误发生位置和原因的详细信息,可帮助你查明问题所在。
Traceback(most recent call last):
File "example.py", line 8, in <module>
main()
File "example.py", line 5, in main
result = divide_numbers(x, y)
File "example.py", line 2, in divide_numbers
return a / b
ZeroDivisionError: division by zero
ZeroDivisionError: division by zero–– –– 实际的错误信息。
6.使用try和except进行错误处理
使用try和except进行错误处理就像攀爬时佩戴安全带。
安全带(try 块)允许你继续攀爬(代码执行),但如果你滑倒(发生错误),安全带会抓住你(except 块),防止跌落(程序崩溃)。这样,你就可以安全地浏览代码中的危险部分,而不会突然停止一切。
将可能引发错误的代码包装在try块中,并使用except块处理异常。这可以帮助你管理和理解错误,而不会导致程序崩溃。
例子
try:
risky_code()
except Exception as e:
print(f"An error occurred: {e}")
7. 用类型检查
就像在开始烹饪之前要检查配料是否正确且数量正确一样,类型检查可在运行代码之前确保变量和函数具有正确的类型。这可以帮助你尽早发现潜在的混淆(类型相关错误),防止问题在以后破坏你的程序。
使用类型提示和工具mypy执行静态类型检查并在运行之前捕获类型相关的错误。
命令
mypy your_script.py
8.使用断言进行测试
你使用断言检查代码中的条件在特定点是否正确。如果某些东西看起来不自然,断言会立即捕捉到它,帮助你发现并修复逻辑错误,以免它们造成更大的问题。
使用assert语句来验证代码中各个点的条件是否成立。断言可以帮助尽早发现逻辑错误。
例子
assert x > 0, "x must be positive"
9.使用 Linters 分析代码
使用 linters 分析代码就像对你的写作进行语法检查一样。
就像语法检查器会突出显示文本中的错误、不恰当的措辞和风格问题一样,
linter 会扫描你的代码,查找语法错误、 编码风格违规和潜在错误。这有助于你清理代码,使其更易读、更一致且无错误。
使用 pylint 或 flake8 等 linters来捕捉语法错误、文体问题和潜在错误。
命令:pylint your_script.py
10. 使用代码分析器进行监控
使用代码分析器就像使用健身追踪器来监控你的锻炼一样。
为什么我要对健身追踪器说这些,因为就像健身追踪器可以测量你的表现,识别需要改进的地方,并在需要时为你提供指导一样,代码分析器也可以跟踪同样的工作。你的程序如何运行并突出显示其运行速度变慢或遇到问题的地方。这有助于你优化代码并提高其效率。
使用分析工具cProfile来测量代码的性能并识别可能导致意外行为的瓶颈或区域。
命令:python -m cProfile your_script.py
写在最后
在本文中,我们探讨了识别代码或项目中的错误的各种方法和做法。无论你是初学者还是大佬级,这些技巧对于发现错误都非常有用。我们介绍了十种不同的技巧,每种技巧都用简单的类比来解释,以帮助你掌握基础知识。