在我们平时编写程序时,常常会遇到各种错误,俗称BUG。而我们程序猿的工作常常需要对程序进行调试,也就是所谓的debug。

程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。而在 python 程序编写时,常常使用以下几种方法进行调试:

1、使用print 方法,在程序运行的关键处打印出相关信息。	缺点:在程序发行时,需要去除这些调试用代码。
2、使用assert机制,通过使用断言的方式,在程序错误时打印出相关信息。
3、记录日志
4、IDE自带的调试

print调试

print 函数可以打印运行中变量的值以及输出提示信息。

我们可以在可能会发生错误的代码处写上提示,通过if判断或except等方法触发。或者使用print在运行时跟踪某个变量,输出运行状态数值变化等,进行调试。

使用print调试真的是非常方便,简单粗暴,哪里不顺眼加一句print,在运行一遍就能看出效果。但使用print进行debug效率太低。

一般我们在程序的可疑处使用print打印一下,从输出情况判断程序是否发生错误,如果程序中存在的可疑之处过多,或者程序代码过于庞大,显然在每个地方都加print是一件极其低效的事情。另外,在程序发行时还得清除所有多余的print语句,调试代价太大,效率也不高。

使用断言

assert(断言)用于判断一个表达式,如果表达式结果为 false 时触发异常。而结果为 True 则继续执行下一行语句。

断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在 Linux 系统下运行,可以先判断当前系统是否符合条件。如果条件不满足则中断程序。

‘’‘
该实例引用自 菜鸟教程 runoob.com
’‘’
import sys
assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"

使用assert进行判断,如果条件为 False 则中断程序并输出提示信息。

assert 1>2 , "这是提示信息:错误 1 不小于 2"

输出:
Traceback (most recent call last):
File "F:/untitled/python学习/断言.py", line 5, in <module>
assert 1>2 , "这是提示信息:错误 1 不小于 2"
AssertionError: 这是提示信息:错误 1 不小于 2

另外可以通过 `try…except…`` 捕获错误信息

try:
assert 1>2 , "这是提示信息:错误 1 不小于 2"
except AssertionError as e:
print(e) 输出:
这是提示信息:错误 1 不小于 2

记录日志

如果说我们的程序已经发布无法得到客户运行后的错误信息,或者由于某些原因使用 print 或这 assert 的方式调试不太方便时,我们可以通过记录日志的方式,把每个错误的的信息记录进日志文件,我们通过分析日志文件便可以找到错误的原因,进而进行程序上的调整和优化。

目前还没学会,Mark。以后补上

另外,记录一个 logging.basicConfig 的配置。

# 通过logging.basicConfig函数对日志的输出格式及方式做相关配置
import logging
logging basicConfia(level=logging .DEBUG,
format='%(asctime)s 9%(ilename)l[ine:%(lineno)d] %(levelname)s
%(message)s',
datefmt=*'%a, %d %b %Y %H:%M:%S',
filename='myapp.log',
filemode='w')
logging. debug(This is debug message')
logging.info(This is info message')
logging.warning('This is warning message') ./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2 py[line.11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2 pyl[line.12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.pylie: 13] WARNING This is warning message

IDE的集成开发环境

Python IDE还挺多的,

比如PyCharm,PyCharm 官方下载地址:http://www.jetbrains.com/pycharm/download/

Sublime Text, Eclipse+Pydev等等。

我比较推荐 PyCharm,之前也没用过别的IDE,但第一次使用PyCharm就觉得很不错,对我这个python 新人很友好。当然你可以根据自己的喜好来选择适合自己的 Python IDE。比如 vs code就不错,听说vs code已经可以支持可视化 debug 了,虽然目前只支持JavaScript/TypeScript ,不过项目维护者已经在讨论添加对 Python 的支持了。不知道以后能不能实现对 C/C++ 的支持。

咳咳,扯远了,使用IDE调试非常简单,自己动手试试就会了,这里就不再赘述了。

写完博客也去下一个 vs code 玩玩,最后附上vscode-debug-visualizer项目地址:https://github.com/hediet/vscode-debug-visualizer

python学习笔记(六)——程序调试的更多相关文章

  1. Python学习笔记六

    Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...

  2. python学习笔记六 面向对象相关下(基础篇)

    面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以将多函数中公用的变量封装到对象中) 对象,根据模板创建的 ...

  3. python学习笔记六 初识面向对象上(基础篇)

    python面向对象   面向对象编程(Object-Oriented Programming )介绍   对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性 ...

  4. python学习笔记012——pdb调试

    1 描述 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能, 主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等 调 ...

  5. python学习笔记之pdb调试

    之前一直说要学python可还是一直停留在看的层面,昨天大神手把书教我pdb调试,说要摆脱IDE集成开发环境编程,感激不尽,立一个flag,python一定要入门! 1.进入方式 1)windows ...

  6. python学习笔记六——堆栈和队列

    4.2.3 列表的查找.排序.反转 list列表可以进行添加.删除操作,此外List列表还提供了查找元素的方法.list列表的查找提供了两种方式,一种是使用index方法返回元素在列表中的位置,另一种 ...

  7. python学习笔记(六):常用模块

    一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...

  8. python学习笔记03 --------------程序交互与格式化输出

    1.读取用户输入内容 语法:input() 例: name = input('你的名字是?) print('你好'+name) 程序会等待用户输入名字后打印:你好(用户输入的名字) 注意:input接 ...

  9. python学习笔记(六)---文件操作与异常处理机制

    文件读取 读取整个文件 要读取文件,需要一个包含几行文本的文件.下面首先来创建一个文件,它包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行: pi_digits.txt 3.14159 ...

  10. Python学习笔记六--文件和输入输出

    6.1文件对象 所有Python对文件的操作都是基于对文件对象的操作.那么就从文件对象的创建说起.open()[file()]提供初始化输入输出的接口.open()成功打开文件时会返回一个文件对象. ...

随机推荐

  1. MegaRAID管理工具操作手册-从零到无

    --时间:2021年1月25日 --作者:飞翔的小胖猪 前言 文档约定红色字体的E表示Enclosure Device ID.红色字体S表示Slot Number.红色字体A表示Adapter号.红色 ...

  2. Java基础--序列化和反序列化

    作用:在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Sessi ...

  3. VT 入门篇——最小 VT 实现(上)

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  4. WPS:添加公式后,行间距变宽的解决方法

    找到公式所属段落的样式,右键修改样式 左下角'格式'中选择'段落' 段落间距设置为0,不要勾选与文档网格对齐

  5. LeetCode-099-恢复二叉搜索树

    恢复二叉搜索树 题目描述:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换.请在不改变其结构的情况下,恢复这棵树. 进阶:使用 O(n) 空间复杂度的解法很容易实现.你能想出一个只使用 ...

  6. LGP5544题解

    题目大意 题意这么明显就不说了qwq 首先最值,而且也想不到啥解法,果断 \(\rm SA\). 然后是初始位置.初始位置就是 \(((\sum_{i=1}^m x)/m,(\sum_{i=1}^m ...

  7. 关于dotnet动态生成controller的问题

    一些动态生成controller的问题 前言 最近在写包, 一开始封装了仓储Repository用于操作数据库, 然后为了快速开发一些业务简单的接口, 通过QueryController , Modi ...

  8. ActiveMQ-模块代码-02

    模块模式 p2p模式 生产者 ConfigBeanQueue package com.producerp2p.producerp2p; import org.apache.activemq.comma ...

  9. SpringBoot巧用 @Async 提升API接口并发能力

    异步调用几乎是处理高并发Web应用性能问题的万金油,那么什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依 ...

  10. 阿里一面,说说你对Mysql死锁的理解

    又到了金三银四的时候,大家都按耐不住内心的躁动,我在这里给大家分享下之前面试中遇到的一个知识点(死锁问题),如有不足,欢迎大佬们指点指点. 1.什么是死锁? 死锁指的是在两个或两个以上不同的进程或线程 ...