【100天精通python】Day18:python程序异常与调试_常用程序调试方式与技巧,如何将调试代码与正式代码分开

news2024/11/16 8:24:31

一 程序调试

        在Python中,调试是指识别和修复程序中的错误和问题。 调试是程序开发过程中必不可少的一部分,合理利用调试工具和技术可以提高程序开发的效率和质量。Python提供了几种用于调试的工具和技术,帮助开发者找出程序中的bug并进行修复。以下是一些常用的Python程序调试技术:

1 使用print语句

        简单粗暴地在代码中插入print语句,输出变量的值或程序执行的状态,以便跟踪程序的执行过程,查看程序执行过程中的变量状态。

def add_numbers(a, b):
    print("a:", a)
    print("b:", b)
    result = a + b
    print("result:", result)
    return result

add_numbers(2, 3)

 2 使用IDE的调试功能

        许多集成开发环境(IDE)都提供了强大的调试功能,可以逐行执行代码,查看变量的值,检查栈跟踪等。常用的Python IDE,如PyCharm、Visual Studio Code、Spyder等都支持调试功能。

2.1 python自带的IDLE调试

(1)打开IDLE, 选择菜单栏的Debug—>Debugger, 

 (2)调出Debug Contorl 对话框,同时python shell窗口显示[DEBUG ON],表示已经处于调试状态

 (3)然后再python shell 窗口中选择file,打开要调试的文件,如tickets.py

 (4)在这个文件上添加需要的断点

设置断点后,程序执行到断点时会暂时终端执行,也可以随时操作继续。

添加断点的方法:在需要添加断点的所在行上,单击鼠标右键,在弹出的快捷菜单中选择SetBreakPoint,

设置断点后,所在行会变成黄色

(5) tickets.py 中点击Run,IDLE会输出交互,利用DebugControl 的Go 选项进行断点调试。

 (6)DebugControl中的各项解释如下:

2.2 使用pycharm的调试功能

2.2.1 添加断点

鼠标选中需要设置断点的行,点击代码区左边竖栏,可以下断点,再次点击可以取消断点。如下图红色圆圈表示断点设置成功 。

2.2.2 运行调试模式

选择右上角的debug按钮或者alt+shift+F9,程序执行时会在下断点的位置停下来。

进入debug模式之后会出现如图下框。

  上图红框的箭头的含义:

1.show execution point:显示当前所有断点。

2.step over:执行当前的函数或者语句,不会进入当前函数的具体方法,执行完当前的语句之后直接跳到下一句。(例:函数A内存在子函数a时,不会进入子函数a内执行单步调试,而是把子函数a当作一个整体,一步执行。)

3.step into:如果某行调用其他模块的函数,可以进入函数内部,会跳到调用函数的地方执行。(例:函数A内存在子函数a时,会进入子函数a内执行单步调试。)

4.step into my code:与step into是类似的,这个调试的话会进入调试的地方会更细有的时候会进入python本身的库函数执行的地方。

5.step out:返回到上一次的调试的位置。

6.run to cursor:直接跳到下一个断点(从现在的断点跳到打的下一个断点处)。
————————————————
原文链接:https://blog.csdn.net/cunrran/article/details/126975770

3 使用断点调试器pdb

        Python提供了pdb模块,是Python调试器的标准库。可以通过在代码中插入import pdb; pdb.set_trace()语句,在该位置设置一个断点,然后在运行程序时会暂停在断点处,允许你逐行查看代码并检查变量的值。 pdb模块,它是一个交互式调试器,可以在代码中插入调试器命令来检查程序状态。

import pdb

def divide_numbers(a, b):
    pdb.set_trace()  # 插入调试器命令
    return a / b

result = divide_numbers(10, 0)
print("result:", result)

4 使用日志logging模块

        通过在程序中添加日志记录,可以跟踪程序的执行过程并查看各个阶段的输出和变量值。logging模块是Python的内置模块,用于记录程序运行时的日志信息,可以帮助你更好地理解程序的执行流程。

import logging

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug("Debug message")
logging.info("Info message")
logging.warning("Warning message")
logging.error("Error message")

 5 使用assert语句

        assert语句用于检查代码中的条件是否满足,如果条件不满足,则抛出AssertionError异常。在程序中添加assert语句,可以在运行时检查程序的状态,如果断言失败,则会触发异常,帮助你快速发现问题所在。

def divide_numbers(a, b):
    assert b != 0, "除数不能为0"
    return a / b

result = divide_numbers(10, 0)
print("result:", result)

6 使用异常追踪

        当程序出现异常时,Python会自动输出异常信息,包括异常类型、发生异常的位置和栈跟踪信息。通过查看异常信息,可以定位和修复错误。

要使用异常追踪进行调试,可以遵循以下步骤:

  1. 确定异常类型:当程序运行时发生异常,Python会告诉我们异常的类型,例如ZeroDivisionError、TypeError、ValueError等。首先要根据异常类型来定位问题的大致范围。

  2. 查看异常追踪信息:当异常发生时,Python会打印出异常追踪信息,其中包含了异常的类型、文件名、行号等信息。我们可以查看这些信息来了解异常发生的位置。

  3. 进行调试:根据异常追踪信息,我们可以找到导致异常的具体代码行。在该位置附近检查代码,查看变量的值,确保代码逻辑正确。可以使用print语句输出变量的值,或者使用Python的内置调试模块pdb进行交互式调试。

以下是一个示例,演示了使用异常追踪进行调试的过程:

def divide_numbers(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError as e:
        # 打印异常信息
        print(f"Error: {e}")
        # 打印异常追踪信息
        import traceback
        traceback.print_exc()

def main():
    num1 = 10
    num2 = 0
    # 调用函数,可能会发生ZeroDivisionError异常
    result = divide_numbers(num1, num2)
    print(f"Result: {result}")

if __name__ == "__main__":
    main()

        在上面的示例中,函数divide_numbers用于计算两个数的商,当除数为0时会发生ZeroDivisionError异常。在main函数中调用divide_numbers函数,并捕获异常。

        如果异常发生,我们打印异常信息和异常追踪信息。通过观察异常追踪信息,我们可以知道异常发生的位置在divide_numbers函数的第三行,帮助我们快速定位问题所在。

        使用异常追踪进行调试可以帮助我们快速定位代码中的问题,并修复错误,提高代码的稳定性和可靠性。

7 使用代码分析工具

        Python中有一些代码分析工具,如pylintpyflakes,可以帮助你找出代码中的错误和潜在问题。

7.1 Pylint

        Pylint是一个强大的静态代码分析工具,可以检查Python代码的语法错误、风格问题和潜在的bug。它会对代码进行严格检查,并生成详细的报告。

        示例:在终端bash运行以下命令,对指定的Python文件进行静态代码分析。

pylint your_file.py

 7.2 Pyflakes

        Pyflakes是另一个轻量级的静态代码分析工具,用于查找Python代码中的错误和问题。它主要关注于语法错误和未使用的变量。

        示例:在终端运行以下命令,对指定的Python文件进行代码检查。

pyflakes your_file.py

7.3 Flake8

        Flake8是一个集成了Pylint、Pyflakes和PEP8检查的代码分析工具,它可以同时检查代码的语法、风格和错误。

        示例:在终端运行以下命令,对指定的Python文件进行代码检查。

flake8 your_file.py

7.4 Bandit

        Bandit是一个专门用于检查Python代码中安全问题的工具,它可以帮助你找出潜在的安全漏洞和风险。

        示例:在终端运行以下命令,对指定的Python文件进行安全性分析

bandit your_file.py

使用这些代码分析工具,我们可以快速发现代码中的问题,并及时进行修复,从而提高代码的质量和可维护性。建议在开发过程中定期运行代码分析工具,以确保代码的健壮性和安全性。

二  如何将调试代码与正式代码分开

        在编写正式代码时,通常应该避免在其中包含调试代码和调试语句,以确保代码的可读性和可维护性。调试代码和调试语句主要用于在开发阶段帮助我们调试程序,定位问题和查找错误。在正式代码中保留这些调试代码可能会影响代码的性能和稳定性,而且不利于代码的维护。

        因此建议 在调试过程中,建议将调试代码和调试语句与正式代码分开,以避免在生产环境中产生不必要的输出或影响程序性能。调试完毕后,记得及时清理调试代码和语句。

为了将调试代码和调试语句与正式代码分开,可以考虑以下方法:

(1)使用条件判断

        在编写调试代码时,使用条件判断语句来控制代码的执行。例如,可以使用if语句来判断是否处于调试模式,只有在调试模式下才执行调试代码。

DEBUG_MODE = True

if DEBUG_MODE:
    # 调试代码
    print("Debugging...")

# 正式代码
# ...

(2)使用日志记录

        在调试代码中,可以使用日志记录来输出调试信息,而不是直接在控制台打印调试信息。这样可以方便地开启或关闭调试信息的输出。

import logging

logging.basicConfig(level=logging.DEBUG)

# 调试代码
logging.debug("Debugging...")

# 正式代码
# ...

(3)使用断言

        在调试代码中,可以使用断言来进行条件检查,如果断言失败,则会抛出AssertionError异常。这可以帮助我们在调试时快速定位问题。

DEBUG_MODE = True

if DEBUG_MODE:
    # 调试代码
    assert some_condition, "Some condition failed."

# 正式代码
# ...

通过以上方法,我们可以有效地将调试代码和调试语句与正式代码分开,从而确保在正式环境中不会执行调试代码,提高代码的可靠性和性能。同时,在需要调试时,只需要简单地调整相关的调试标志或参数即可开启调试模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/800887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文笔记:Fine-Grained Urban Flow Prediction

2021 WWW 1 intro 细粒度城市流量预测 两个挑战 细粒度数据中观察到的网格间的转移动态使得预测变得更加复杂 需要在全局范围内捕获网格单元之间的空间依赖性单独学习外部因素(例如天气、POI、路段信息等)对大量网格单元的影响非常具有挑战性——>论…

Spring Batch教程(五)spring boot实现batch功能注解示例:读写文本文件(读取一行数据,针对一行数据进行求和)

Spring batch 系列文章 Spring Batch教程(一) 简单的介绍以及通过springbatch将xml文件转成txt文件 Spring Batch教程(二)示例:将txt文件转成xml文件以及读取xml文件内容存储到数据库mysql Spring Batch教程&#xff…

【Spring】Spring 总览

一、简单介绍一下 Spring Spring是一个全面的、企业应用开发的一站式解决方案,贯穿表现层、业务层、持久层,可以轻松和其他框架整合,具有轻量级、控制反转、面向切面、容器等特征。 轻量级 : 空间开销和时间开销都很轻量 控制反…

应用无线鼠标中的2.4GHz无线收发芯片

无线键盘和无线鼠标作为现代办公环境中常见的工具,为我们的工作带来了便利。无线键盘和无线鼠标的工作原理都是基于无线技术实现的,其中常见的是2.4GHz无线技术。让我们一起来详细了解一下它们的工作原理。 无线鼠标的原理非常简单,鼠标部分工作与传统鼠…

运放稳定性分析

基础回顾 电路系统的传函 记基本量为: 电量(库伦) q q q、电流 i i i、电压 e e e、电阻 R R R、电容 C C C、电感 L L L 电阻 e R i R e_RiR eR​iR,阻抗 R R R 电容 q C e C qCe_C qCeC​,故 e C 1 C q 1 C…

K8s 详解(一) K8s 架构和常用命令

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

芯片制造详解.净洁室的秘密.学习笔记(三)

这是芯片制造系列的第三期跟学up主三圈,这里对其视频内容做了一下整理和归纳,喜欢的可以看原视频。 芯片制造详解03: 洁净室的秘密|为何芯片厂缺人? 芯片制造详解.净洁室的秘密.学习笔记 三 简介一、干净的级别二、芯片…

ClickHouse(四):ClickHouse分布式搭建及其他

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 📌订阅…

Python爬虫实例之淘宝商品页面爬取(api接口)

可以使用Python中的requests和BeautifulSoup库来进行网页爬取和数据提取。以下是一个简单的示例: import requests from bs4 import BeautifulSoupdef get_product_data(url):# 发送GET请求,获取网页内容headers {User-Agent: Mozilla/5.0 (Windows NT…

管理类联考——大纲篇

综合能力考试大纲 Ⅰ、考试性质 综合能力考试是为高等院校和科研院所招收管理类专业学位硕士研究生而设置的具有选拔性质的全国联考科目,其目的是科学、公平、有效地测试考生是否具备攻读专业学位所必须的基本素质、一般能力和培养潜能,评价的标准是高…

python自动化测试+unittets框架

我们整个自动化才是报告的环节基本上分为三个部分: 1.测试用例的准备 2.测试用例的执行 3.测试报告的输出 1.测试用例的准备: 那我们就以搜孤网页做一个简单的用例: from selenium import webdriver import unittest class Case_1(unit…

【随机森林-鸢尾花分类】

1. 引言 随机森林是集成学习中的一颗瑞士军刀,它是一种强大的机器学习算法,常用于分类和回归任务。随机森林集合了“三个臭皮匠,顶个诸葛亮”的智慧,通过组合多个决策树的预测结果,来提高模型的鲁棒性和性能。 2. 随…

学习笔记|大模型优质Prompt开发与应用课(二)|第一节:大模型应用密码—Prompt的一千种打开方式

文章目录 第一节:大模型应用密码—Prompt的一千种打开方式01你可能听过一个小故事1910华盛顿纺织厂罢工事件 02 小问题:哪些场景会被提效类目一︰减少重复性工作的成本(降本)例如∶做策划初稿、写JD、润色文案prompt生成结果prompt生成结果prompt生成结果promptprom…

个人博客系统项目进行自动化测试

目录 一、项目界面 二、博客系统自动化测试用例 三、自动化测试 1)准备工作 2)登录界面测试 测试正确的登录案例 登录界面测试出现问题 测试错误的登录案例 3)博客列表界面测试 4)博客详情界面测试 5)博客编辑…

DEVICENET转ETHERNET/IP网关devicenet协议

捷米JM-EIP-DNT,你听说过吗?这是一款自主研发的ETHERNET/IP从站功能的通讯网关,它能够连接DEVICENET总线和ETHERNET/IP网络,从而解决生产管理系统中协议不同造成的数据交换互通问题。 这款产品在工业自动化领域可谓是一大利器&…

【QT 网络云盘客户端】——主窗口界面的设计

目录 1.设计主窗口界面 2.设置窗口的背景图片 3. 自定义标题栏 3.1 设置toolbutton按钮的图片 3.2 设置按钮的大小 3.3 将自定义标题栏添加设置到主页面中 3.4 去除窗口的原标题栏 3.5 设置按钮颜色 3.6 切换页面功能实现 4.我的文件页面的设计 4.1 菜单栏的设计 4…

插件使用权限管理软件(三)WebAPI项目IIS部署

前言 前面完成了WebAPI项目的接口服务类编写工作,接下来讲把项目部署到服务器的IIS上,让系统运行起来。 一. 项目发布 右键项目RightsManagementSystems.Web.Entry 选择“发布”选项 弹出发布选项界面,选择“文件夹”,点击下一步…

【Android知识笔记】UI体系(一)

Activity的显示原理 setContentView 首先开发者Activity的onCreate方法中通常调用的setContentView会委托给Window的setContentView方法: 接下来看Window的创建过程: 可见Window的实现类是PhoneWindow,而PhoneWindow是在Activity创建过程中执行attach Context的时候创建的…

SystemServer进程

前言 在systemServer启动文章中我们讲了在SystemServer.java的main方法里面调用new SystemServer().run()方法启动System_server进程。那么我们接着看一下SystemServer.java具体做了哪些事情? ##SystemServer的run方法介绍 frameworks\base…

VictoriaMetrics

VictoriaMetrics是一个开源的时序数据库和监控解决方案,专门用于存储和查询大规模时间序列数据。它的设计灵感来自Prometheus,但在某些方面与Prometheus有所区别,主要关注于提供高性能、高可用性和低资源占用的特点。 一、与Prometheus区别和…