Python编程让繁琐的工作自动化(10)-调试

2024-05-06 20:08

本文主要是介绍Python编程让繁琐的工作自动化(10)-调试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序员的笑话:编码占了编程工作量的90%,调试占了另外的90%。
代码出问题很正常,有一些好的工具和技巧可以确定你的代码在做什么,以及哪出了问题。首先,要查看日志和断言,其次要学习如何使用调试器。

抛出异常

#直接抛出异常对象,会引起程序崩溃
>>>raise Exception('this is the erro message.')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
Exception: this is the error message.
#利用try和except处理异常信息
def boxPrint(symbol, width, height):if len(symbol) != 1:raise Exception('Symbol must be a single character string.')if width <= 2:raise Exception('Width must be greater than 2.')if height <= 2:raise Exception('Height must be greater than 2.')print(symbol * width)for i in range(height-2):print(symbol + (' ' * (width-2)) +symbol)print(symbol*width)for sym, w, h in (('*', 4, 4), ('0', 20, 5), ('x', 1, 3), ('zz', 3, 3)):try:boxPrint(sym, w, h)except Exception as err:print('An exception happened: ' +str(err)) 
#以下为输出
****
*  *
*  *
****
00000000000000000000
0                  0
0                  0
0                  0
00000000000000000000
An exception happened: Width must be greater than 2.
An exception happened: Symbol must be a single character string.

记录反向跟踪的字符串

python遇到错误,会生成一些错误信息,称为‘反向跟踪’。反向跟踪包含了出错消息、导致该错误的代码行号,以及导致该错误的函数调用的序列。这个序列称为‘调用栈’。

def bacon():raise Exception('Symbol must be a single character string.')
def spam():bacon()
spam()
#输出如下:
Traceback (most recent call last):File "1.py", line 5, in <module>spam()File "1.py", line 4, in spambacon()File "1.py", line 2, in baconraise Exception('Symbol must be a single character string.')
Exception: Symbol must be a single character string.
#通过从下往上看,就能依次找出错误的位置,这就是调用栈的作用
#如果希望得到异常的反向跟踪的信息,但也希望except语句能够优雅地处理该异常,可以调用traceback.format_exc()
import traceback
try:raise Exception('This is the error message.')
except:errorFile = open('errorInfo.txt', 'w')errorFile.wirte(traceback.format_exc())errorFile.close()print('The traceback info was written to errorInfo.txt.')
#输出
116
The traceback info was written to errorInfo.txt

断言

断言就是对语句做检查,来确保代码按照逻辑运行,如果检查失败,说明代码没有按照预想的发展就会出错。
在日常英语中,assert语句是说:我断言这个条件为真,如果不为真,程序中什么地方就有个缺陷。和异常不一样,代码不能用try和except来处理assert语句。如果assert失败,则应该马上崩溃。这样可以减少为了寻找出错的代码而要检查的代码量。

语法:
assert 要判断的语句,判断失败要显示的字符串

podBayDoorStatus = 'open'
assert podDoorStatus=='open', 'The pod bay doors need to be "open".'
podBayDoorStatus = 'I \'m sorry, dave.'
assert podDoorStatus=='open', 'The pod bay doors need to be "open".'
#输出
Traceback (most recent call last):File "1.py", line 2, in <module>assert podDoorStatus=='open', 'The pod bay doors need to be "open".'
NameError: name 'podDoorStatus' is not defined

在运行python时传入-O选项可以禁用断言。完成了程序编写和测试后,如果不希望检查,可以禁用。断言是针对开发而不是最终产品的。

日志

记日志可以理解程序中发生的事情以及事情发生的顺序。python的logging模块使得你可以创建自定义的消息记录。

不要用print调试,因为调试完成后你需要花很多时间注释或者清除掉print语句,甚至会误删除。而利用日志时,只需要在添加logging.disable(logging.CRITICAL)就可以禁用。日志消息是给程序员看的,而不是给用户的。

日志级别

级别日志函数描述
DEBUGlogging.debug()最低级别,用于小细节,通常只有在诊断问题时才关心
INFOlogging.dinfo()用于记录程序中一般事件的信息,或确认一切工作正常
WARNINGlogging.warning()用于表示可能的问题,不会阻止程序工作,但将来可能会
ERRORlogging.error()用于记录错误,它导致程序做某事失败
CRITICALlogging.critical()最高级别,用于表示致命的错误,它导致或将要导致程序弯曲停止工作

日志消息作为字符串传递给这些函数,日志级别是一种建议,最终由你来决定日志消息属于哪一种类型

import logging
#level控制显示的级别,将logging.DEBUG换成logging.ERROR,将只显示ERROR和CRITICAL消息,跳过其他消息。
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
#禁用日志会禁用该代码后面的同级别和更低的级别的消息。
#logging.disable(logging.ERROR)
>>> logging.debug('Some debugging details.')2019-03-03 13:14:10,764 - DEBUG - Some debugging details.
>>> logging.info('the logging module is working.')2019-03-03 13:14:34,788 - INFO - the logging module is working.
>>> logging.warning('an error message is about to be logged.')2019-03-03 13:15:04,268 - WARNING - an error message is about to be logged.
>>> logging.error('an error has accured.')2019-03-03 13:15:21,035 - ERROR - an error has accured.
>>> logging.critical('the program is unable to recover!')2019-03-03 13:15:46,292 - CRITICAL - the program is unable to recover!
#将日志记录到文件,只需要添加关键字参数即可
logging.basicConfig(filename='mylogging.txt',level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

调试器

IDLE的调试器和其他编译器的功能差不多,这里不再赘述。

这篇关于Python编程让繁琐的工作自动化(10)-调试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/965252

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as