#科研筑基# python初学自用笔记 第十一篇 错误、调试和测试

news2024/9/22 1:00:53
  • 错误:包括程序编写错误、用户输入错误、客观条件引起的错误

  • 调试:跟踪程序的执行,查看每一步变量的值是否正确

  • 测试:编写测试用来反复运行程序,确保程序输出符合我们编写的测试

错误处理

try

在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误码,如果由我们自己编写,那会很繁杂,幸好python内置了一套try...except...finally..的错误处理机制:

try:
    print('try...')
    r=10/int('2')
    print('result:',r)
except ZeroDivisionError as e:  #如果try语句出现了错误,except就会判断是否为某种错误
    print('except:',e)
except ValueError as e:  #错误类型还有很多种,但是只用同一种代码e来表示
    print('except:',e)
else:  #若没有出现错误,使用else语句打印无误提示
    print('no error!')
finally:  #无论上面1有没有出现错误1,finally语句都会执行
    print('finally...')
print('END')
'''
try...
result: 5.0
no error!
finally...
END
'''

调用栈

如果没有使用try来捕获错误,错误就会一直向上抛,最被python解释器捕获,打印出错误信息,我们通过分析信息来定位错误:

def foo(s):
    return 10/int(s)
def bar(s):
    return foo(s)*2
def main():
    bar('0')
print(main())
'''
Traceback (most recent call last):  #这是错误的跟踪信息
  File "C:\Users\ASUS\PycharmProjects\pythonProject1\11.6.py", line 840, in <module>  
    print(main())  #调用main出错了,在代码的第840行
  File "C:\Users\ASUS\PycharmProjects\pythonProject1\11.6.py", line 839, in main
    bar('0')  #调用bar出错了,在代码的第839行
  File "C:\Users\ASUS\PycharmProjects\pythonProject1\11.6.py", line 837, in bar
    return foo(s)*2  #return foo(s)*2这个语句出错了,在第837行
  File "C:\Users\ASUS\PycharmProjects\pythonProject1\11.6.py", line 835, in foo
    return 10/int(s)  #return 10/int(s)这个语句出错了,下面没有类似的错误信息,说明这是错误的源头
ZeroDivisionError: division by zero  #错误源头的错误类型就是0作除数
'''

记录错误

python内置的logging模块可以很容易地记录错误信息:

import logging
def foo(s):
    return 10/int(s)
def bar(s):
    return foo(s)*2
def main():
    try:
        bar('0')
    except Exception as e:
        logging.exception(e)  #在显示错误的同时,将错误记录到日志里
main()
print('END')

抛出错误

用raise抛出自己定义的错误示例:

class FooError(ValueError):
    pass
def foo(s):
    n=int(s)
    if n==0:
        raise FooError('invalid value:%s' %s)  
    return 10/n
print(foo('0'))

只有在必要时才定义我们自己错误类型,尽量使用python内置的错误类型。

还可以先捕获错误、打印出来,再用raise语句将错误向上抛,因为有时候一些错误单靠自己解决不了,需要抛给能解决错误的人来解决:

def foo(s):
    n=int(s)
    if n==0:
        raise ValueError('invald value:%s' % s)
    return 10/n
def bar():
    try:
        foo('0')
    except ValueError as e:
        print('ValueError!')
        raise  #raise语句若不带参数,就会把当前错误原样抛出
bar()

此外,在except中的raise还可以将错误转化成另一种类型:

try:
    10/0
except ZeroDivisionError:  #不用再写 as e
    raise ValueError('input error!')

调试

程序运行中难免会出现错误,就需要一套调试程序来对运行中变量的值进行检测,从而修复bug。

断言 assert

def foo(s):
    n=int(s)
    assert n!=0,'n is zero!'  #表达式 n!=0 应该是 True,否则后面的代码一定会出错,若断言失败,assert语句就会抛出后面那句话
    return 10/n
def main():
    foo('0')

可以在启动python解释器时用参数 -O 来关闭assert,之后遇到的assert都可以看成pass语句。

logging

import logging
logging.basicConfig(level=logging.INFO)  #指定记录信息的级别
s='0'
n=int(s)
logging.info('n=%d' % n)  #输出错误原因,并上传到日志
print(10/n)

日志等级说明:

  • DEBUG:程序调试bug时使用

  • INFO:程序正常运行时使用

  • WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误

  • ERROR:程序出错误时使用,如:IO操作失败

  • CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使 用

  • 默认的是WARNING等级,当在WARNING或WARNING之上等级的才记录日志信息。

  • 日志等级从低到高的顺序是: DEBUG < INFO < WARNING < ERROR < CRITICAL

pdb

pdb是python交互模式可以使用的一种调试器。准备好程序后,在对话框中输入:

$ python -m pdb err.py

就启动了pdb调试器,接下来可以输入不同的命令来查看或执行:

  • 输入命令 1 :查看代码

  • 输入命令 n :单步执行代码

  • 输入命令 p 变量名 :查看变量

  • 输入命令 q :结束调试,退出程序

pdb.set_trace()

  • 这个方法是用来设置断点,检查断点上方的程序,只需要先加载pdb模块,在程序中合适的地方插入pdb.set_trace()

  • 之后运行代码时,程序会自动在插入的地方暂停并进入pdb调试环境,可以用p查看变量,也可以用c继续运行。

IDE

一个插件,用来调试十分方便。

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

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

相关文章

如何安全存储企业文件?

信息时代的到来&#xff0c;企业文件的安全存储越来越被企业管理者看重。常见的企业文件存储是借用第三方工具&#xff0c;如企业网盘&#xff0c;这种方法性价比高&#xff0c;而且也比较安全&#xff0c;被各大企业所喜爱。市面上的企业网盘类工具不胜枚举&#xff0c;该如何…

O(1)调度器:Linux2.6版本的核心算法

上一章学习了O(n)调度器的设计&#xff0c;以及它的核心算法&#xff0c;其主要思路如下&#xff1a; O(n)调度器采用一个Runqueue运行队列来管理所有可运行的进程&#xff0c;在主调度schedule函数中选择一个优先级最高&#xff0c;也就是时间片最大的进程来运行&#xff0c;…

2019蓝桥杯真题完全二叉树的权值 C语言/C++

题目描述 给定一棵包含 N个节点的完全二叉树&#xff0c;树上每个节点都有一个权值&#xff0c;按从 上到下、从左到右的顺序依次是 A_1, A_2, A_N&#xff0c;如下图所示&#xff1a; 现在小明要把相同深度的节点的权值加在一起&#xff0c;他想知道哪个深度的节点 权值之和最…

力扣2241. 设计一个 ATM 机器

力扣上的一个中等难度的题&#xff0c;之所以写一篇博客记录下来&#xff0c;是因为貌似触发了力扣的彩蛋&#xff0c;第一次遇见&#xff0c;感觉挺有意义的。 题目如下&#xff1a; 一个 ATM 机器&#xff0c;存有 5 种面值的钞票&#xff1a;20 &#xff0c;50 &#xff0c…

手把手教你使用gdb调试器

所谓调试&#xff0c;指的是对编好的程序用各种手段进进行查错和排非错的过程。进行这种查错处理时&#xff0c;下面将讲解如何使用gdb进行程序的调试。 gdb 简介 gdb是一个功能强大的调试工具&#xff0c;可以用来调试C程序或C程序。在使用这个工具进行程序调试时&#xff0…

nodejs学习-4:nodejs连接mongodb和相关操作

1. express生成器生成express模板 前提需要首先下载好&#xff1a;express-generator&#xff0c;命令如下(全局安装) npm install -g express-generator生成模板命令如下&#xff1a; express 项目名称 --viewejs // --view 参数表示前端界面使用的引擎&#xff0c;这里使用…

Java线程池运行原理,线程池源码解读【Java线程池学习二】

一、前奏 有了上一篇博文的学习&#xff0c;相信你对于线程池的使用这块已经不在存在什么问题了&#xff0c;日常开发和面试也都足够了。 线程池最优使用策略【Java线程池学习一】 但随着时间的推移在闲下来的时候我突然想&#xff0c;当任务进入了队列之后是怎么取出来的呢…

linux系统根文件系统构建

根文件系统构建 一、根文件系统简介 根文件系统是 Linux 内核启动以后挂载(mount)的第一个文件系统&#xff0c;从根文件系统中读取初始化脚本&#xff0c;比如 rcS&#xff0c;inittab 等。根文件系统和 Linux 内核是分开的&#xff0c;单独的 Linux 内核是没法正常工作的&a…

快捷获取GDI+绘图参数的两种经验方案

文章目录一、使用系统的枚举二、专用枚举1、颜色Color2、字体Font3、字体名称4、笔刷Brush5、笔Pen6、矩形Rectangle7、点Point8、大小Size文章出处&#xff1a; https://blog.csdn.net/haigear/article/details/129085403在绘图中&#xff0c;常常需要给出颜色&#xff0c;字体…

目标检测各常见评价指标详解

注&#xff1a;本文仅供学习&#xff0c;未经同意请勿转载 说明&#xff1a;该博客来源于xiaobai_Ry:2020年3月笔记 对应的PDF下载链接在&#xff1a;待上传 目录 常见的评价指标 准确率 &#xff08;Accuracy&#xff09; 混淆矩阵 &#xff08;Confusion Matrix&#xff…

SpringBoot实现统一返回接口(除AOP)

起因 关于使用AOP去实现统一返回接口在之前的博客中我们已经实现了&#xff0c;但我突然突发奇想&#xff0c;SpringBoot中异常类的统一返回好像是通过RestControllerAdvice 这个注解去完成的&#xff0c;那我是否也可以通过这个注解去实现统一返回接口。 正文 这个方法主要…

Django框架之模型视图--HttpResponse对象

HttpResponse对象 视图在接收请求并处理后&#xff0c;必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建&#xff0c;HttpResponse对象由开发人员创建。 1 HttpResponse 可以使用django.http.HttpResponse来构造响应对象。 HttpResponse(content响应体, con…

【opencv源码解析0.2】opencv库源码编译

如何编译opencv库源码 大家好&#xff0c;我是周旋&#xff0c;感谢大家学习【opencv源码解析】系列&#xff0c;本系列首发于公众号【周旋机器视觉】。 上篇文章我们介绍了如何配置opencv环境&#xff0c;搞清了opencv的包含目录include、静态库链接以及动态库链接的作用。 【…

(考研湖科大教书匠计算机网络)第五章传输层-第四节:TCP流量控制

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;流量控制概述二&#xff1a;流量控制举例三&#xff1a;拓展阅读&#xff08;可不看&#xff09;&#xff08;1&#xff09;TCP流量控制完整例子&a…

马上卸载这个恶心的软件!

大家好&#xff0c;我是良许。 春节已经过完了&#xff0c;但在这喜庆的日子里&#xff0c;又有一个小丑在上窜下跳了。 没错&#xff0c;这个不要脸的小丑依然还是 Notepad 的作者。 好好的一个开发者&#xff0c;为何老喜欢整一些有得没得的东西&#xff1f;好好搬砖写代码…

pygame8 扫雷游戏

一、游戏规则&#xff1a; 1、点击方格&#xff0c;如果是地雷&#xff0c;游戏失败&#xff0c;找到所有地雷游戏胜利 2、如果方块上出现数字&#xff0c;则表示在其周围的八个方块中共有多少颗地雷 二、游戏主逻辑&#xff1a; 主要逻辑即调用run_game, 然后循环检测事件…

云计算|OpenStack|社区版OpenStack---基本概念科普(kvm的驱动类别和安装)

前言&#xff1a; 云计算里基本都是基于kvm技术作为底层支撑&#xff0c;但&#xff0c;该技术是比较复杂的&#xff0c;首先&#xff0c;需要硬件的 支撑&#xff0c;表现在物理机上&#xff0c;就是需要在BIOS中调整设置虚拟化功能&#xff0c;这个虚拟机功能通常是interVT或…

Fastjson2基础使用以及底层序列化/反序列化实现探究

1 Fastjson2简介 Fastjson2是Fastjson的升级版&#xff0c;特征&#xff1a; 协议支持&#xff1a;支持JSON/JSONB两种协议部分解析&#xff1a;可以使用JSONPath进行部分解析获取需要的值语言支持&#xff1a;Java/Kotlin场景支持&#xff1a;Android8/服务端其他特性支持&a…

python基础知识有哪些需要背(记住是基础知识)我是初学者

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;一个有趣的事情&#xff0c;一个有趣的事情&#xff0c;今天让我们一起来看看吧&#xff01; 1、python基础知识有哪些需要背&#xff08;记住是基础知识&#xff09;我是初学者 或看好Python的广阔前景&#xff0c;或…

RabbitMQ 入门到应用 ( 五 ) 应用

6.更多应用 6.1.AmqpAdmin 工具类 可以通过Spring的Autowired 注入 AmqpAdmin 工具类 , 通过这个工具类创建 队列, 交换机及绑定 import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.Di…