【Pyhon】捕获异常、调试、测试

2024-06-07 18:58

本文主要是介绍【Pyhon】捕获异常、调试、测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要介绍了捕获异常,调试方法,单元测试和文档测试

1.捕获异常

基础用法:try.. except… finally

import logging
try:print('try...')r = 10 / 0
except ValueError as e:    #捕获ValueError类型的异常logging.exception(e)  #出错,但程序打印完错误信息后会继续执行,并正常退出。通过配置打到日志文件
except ZeroDivisionError as e:print('ZeroDivisionError:', e)#合理转化异常类型是合理的raise ValueError('invalid value') #抛出异常【不带参数,就会把当前错误原样抛出】
else:                      #没有异常错误的时候会执行print('no error!')
finally:                   #最后总会执行print('finally...')
print('END')

优点

  • 记录了异常堆栈信息,便于追踪定位问题
  • 增加程序的容错性

注意

  • 一般使用现有的异常类型【详见附录的常见异常类型和继承关系】
  • 正常工作中,如果自己抛出异常,记得文档记录错误类型和出现原因

2.调试

和linux下写代码的调试过程差不多

调试方法和优缺点

方法用法优缺点
printprint('value %d' % n)代码需要手动删除
assertassert true,error info
断言失败,抛出AssertionError
python3 -O test.py 关闭断言
虽然可以直接关闭断言,但是代码依然很乱
logginglogging.info('n = %d' % n)
logging.basicConfig(level=logging.INFO)
debuginfowarningerror
1.允许指定信息级别
2.输出可配置
pdbpython3 -m pdb test.py 手动调试

import pdb
pdb.set_trace()设置断点
n -> next
p -> print
q -> quit
c -> continue
运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境
IDEPython IDE:PyCharm
Eclipse:pydev插件
调试方便

一般调试还是使用logging多

3.测试

单元测试

定义

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

TDD:Test-Driven Development
TDD优点:确保一个程序模块的行为符合我们设计的测试用例

单元测试的写法

mydict1.pydict一致,但是可以通过属性来访问

#mydict1.py
class Dict(dict):def __init__(self, **kw):super().__init__(**kw)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError(r"'Dict' object has no attribute '%s'" % key)def __setattr__(self, key, value):self[key] = value

单元测试 testMyDict.py

import unittest from mydict import Dictclass TestDict(unittest.TestCase):  #测试类必须从unittest.TestCase继承def test_init(self):            #测试方法必须以test开头,否则不被执行d = Dict(a=1, b='test')self.assertEqual(d.a, 1)    #断言函数返回的结果与1是否相等self.assertEqual(d.b, 'test')self.assertTrue(isinstance(d, dict))def test_key(self):d = Dict()d['key'] = 'value'self.assertEqual(d.key, 'value')def test_attr(self):d = Dict()d.key = 'value'self.assertTrue('key' in d)self.assertEqual(d['key'], 'value')def test_keyerror(self):d = Dict()with self.assertRaises(KeyError):   #期待抛出指定类型的Errorvalue = d['empty']              #当d['empty']访问不存在的键,断言抛出KeyErrordef test_attrerror(self):d = Dict()with self.assertRaises(AttributeError):value = d.empty

运行单元测试方法

方法例子
当做正常脚本运行单元测试脚本最后增加代码
if __name__ == '__main__':
unittest.main()

python3 mydict_test.py
在命令行通过参数-m unittest直接运行单元测试【推荐】python3 -m unittest mydict_test

setUp与tearDown

分别在每调用一个测试方法的前后分别被执行,做一些文件,数据库开关的工作

注意

  • 单元测试可以有效地测试某个程序模块的行为
  • 单元测试的测试用例要覆盖常用输入组合、边界条件、异常
  • 代码不要复杂,避免测试代码出bug

文档测试

doctest严格按照Python交互式命令行的输入和输出来判断测试结果是否正确。
只有测试异常的时候,可以用…表示中间一大段烦人的输出。

#mydict2.py
class Dict(dict):'''Simple dict but also support access as x.y style.>>> d1 = Dict()>>> d1['x'] = 100>>> d1.x100>>> d1.y = 200>>> d1['y']200>>> d2 = Dict(a=1, b=2, c='3')>>> d2.c'3'>>> d2['empty']Traceback (most recent call last):...KeyError: 'empty'>>> d2.emptyTraceback (most recent call last):...AttributeError: 'Dict' object has no attribute 'empty''''def __init__(self, **kw):super(Dict, self).__init__(**kw)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError(r"'Dict' object has no attribute '%s'" % key)def __setattr__(self, key, value):self[key] = valueif __name__=='__main__':       #只有命令行直接运行,才会执行doctestimport doctest     doctest.testmod()

直接运行即可。python3 mydict2.py
什么都不输出表示正常,如果有问题,就会报错。

附录

常见异常类型和继承关系

BaseException+-- SystemExit+-- KeyboardInterrupt+-- GeneratorExit+-- Exception+-- StopIteration+-- StopAsyncIteration+-- ArithmeticError|    +-- FloatingPointError|    +-- OverflowError|    +-- ZeroDivisionError+-- AssertionError+-- AttributeError+-- BufferError+-- EOFError+-- ImportError+-- ModuleNotFoundError+-- LookupError|    +-- IndexError|    +-- KeyError+-- MemoryError+-- NameError|    +-- UnboundLocalError+-- OSError|    +-- BlockingIOError|    +-- ChildProcessError|    +-- ConnectionError|    |    +-- BrokenPipeError|    |    +-- ConnectionAbortedError|    |    +-- ConnectionRefusedError|    |    +-- ConnectionResetError|    +-- FileExistsError|    +-- FileNotFoundError|    +-- InterruptedError|    +-- IsADirectoryError|    +-- NotADirectoryError|    +-- PermissionError|    +-- ProcessLookupError|    +-- TimeoutError+-- ReferenceError+-- RuntimeError|    +-- NotImplementedError|    +-- RecursionError+-- SyntaxError|    +-- IndentationError|         +-- TabError+-- SystemError+-- TypeError+-- ValueError|    +-- UnicodeError|         +-- UnicodeDecodeError|         +-- UnicodeEncodeError|         +-- UnicodeTranslateError+-- Warning+-- DeprecationWarning+-- PendingDeprecationWarning+-- RuntimeWarning+-- SyntaxWarning+-- UserWarning+-- FutureWarning+-- ImportWarning+-- UnicodeWarning+-- BytesWarning+-- ResourceWarning

——学习廖雪峰的教程,做的笔记

这篇关于【Pyhon】捕获异常、调试、测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode