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调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(