【廖雪峰Python学习笔记】错误、调试、测试
文章目录
- 错误处理
- 调试
- 单元测试unitcase
- 文档测试
错误类型
- 程序编写问题bug – 字符类型错误等
- 用户输入错误 – 输入不符合规定的字符串
- 异常,程序运行时无法预测 – 磁盘满了,无法写
错误处理
错误处理机制:try…except…finally…
try
运行可能会出错的代码,若出错则后续代码不再运行try
中存在错误代码时,执行except
语句块抛出异常finally
可有可无,不论是否异常,最后都会执行- 所有错误类型均继承自
BaseException
- 不同
except
可以对不同错误类型进行处理 except
可以捕获自身及子类的错误except
可以跨越多层调用
try:print('try...')test_int = 10 / int('a') # 除法运算错误print('result = ', test_int) # 由于上一行代码错误,try的后续代码不再运行
except ZeroDivisionError as e: print('except: ', e)
except ValueError as e:print('ValueError:', e)
else:print('no error was found!')
finally:print('finally...')
print('END')
调用栈:出错时,须分析错误的调用栈信息,以定位错误的位置
Traceback (most recent call last):…………
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()
输出结果:
ERROR:root:division by zero
Traceback (most recent call last):File "/Pratice/DEMO.py", line 8, in mainbar('0')File "/Pratice/DEMO.py", line 5, in barreturn foo(s) * 2File "/Pratice/DEMO.py", line 3, in fooreturn 10 / int(s)
ZeroDivisionError: division by zero
raise
抛出一个错误的实例
def foo(s):n = int(s)if n==0:raise ValueError('invalid value: %s' % s)return 10 / ndef bar():try:foo('0')except ValueError as e:print('ValueError!')raisebar()
输出结果:
Traceback (most recent call last):
ValueError!File "/Pratice/DEMO1.py", line 14, in <module>bar()File "/Pratice/DEMO1.py", line 9, in barfoo('0')File "/Pratice/DEMO1.py", line 4, in fooraise ValueError('invalid value: %s' % s)
ValueError: invalid value: 0
调试
使用print()调试,简单粗暴,但是调试过后需要删除调试代码
assert()
断言
def foo(s):n = int(s)assert n != 0, 'n is zero' # 若‘n != 0’不成立,则抛出AssertionErrorreturn 10/sdef main():foo('0')
main()
输出结果:
Traceback (most recent call last):File "/Pratice/DEMO2.py", line 8, in <module>main()File "/Pratice/DEMO2.py", line 7, in mainfoo('0')File "/Pratice/DEMO2.py", line 3, in fooassert n != 0, 'n is zero'
AssertionError: n is zero
tips:python -O DEMO2.py 可以将DEMO2.py中的assert当成pass来看
2. logging()
记录
输出文件而不是抛出错误
可指定记录信息的级别
通过简单配置,一条语句可同时输出到不同地方
import logging
# 指定记录信息的级别 debug->info->warning->error
logging.basicConfig(level=logging.INFO) s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)
输出结果:
INFO:root:n = 0
Traceback (most recent call last):File "/Pratice/DEMO3.py", line 7, in <module>print(10 / n)
ZeroDivisionError: division by zero
pdb
调试器
让程序以单步方式运行,随时查看运行状态
➜ python -m pdb DEMO.py # 使用调试器查看单步运行状态
> /Users/amey/growingio/Pratice/DEMO.py(1)<module>()
-> import logging
(Pdb) l # l查看代码1 -> import logging2 logging.basicConfig(level=logging.INFO)3 4 s = '0'5 n = int(s)6 logging.info('n = %d' % n)7 print(10 / n)
[EOF]
(Pdb) n # n -> 单步执行代码
> /Users/amey/growingio/Pratice/DEMO.py(2)<module>()
-> logging.basicConfig(level=logging.INFO)
(Pdb) n # n -> 单步执行代码
> /Users/amey/growingio/Pratice/DEMO.py(4)<module>()
-> s = '0'
(Pdb) p s # p 变量名 -> 查看变量
> '0'
(Pdb) q # q -> 结束调试
单元测试unitcase
setUp()
和tearDown()
方法,在调用一个测试方法前后分别执行
[eg:连接关闭数据库]- 使用
python -m unittest test
可以批量运行多个单元测试
编写一个学生成绩单元测试
import unittestclass Student(object):def __init__(self, name ,score):self.name = nameself.score = scoredef get_grade(self):if(self.score > 100 or self.score < 0 or type(self.score) != int):raise ValueErrorelif(self.score < 60):return 'C'elif(self.score < 80):return 'B'else:return 'A'class TestStudent(unittest.TestCase):def test_80_to_100(self):s1 = Student('Amey', 100)s2 = Student('Jimmy', 80)self.assertEqual(s1.get_grade(),'A')self.assertEqual(s2.get_grade(),'A')def test_60_to_800(self):s1 = Student('Bart', 79)s2 = Student('Cindy', 60)self.assertEqual(s1.get_grade(),'B')self.assertEqual(s2.get_grade(),'B')def test_0_to_60(self):s1 = Student('Dan', 59)s2 = Student('Lisa', 0)self.assertEqual(s1.get_grade(),'C')self.assertEqual(s2.get_grade(),'C')def test_invaild(self):s1 = Student('Jan', 101)s2 = Student('King', -1)with self.assertRaises(ValueError):s1.get_grade()with self.assertRaises(ValueError):s2.get_grade()if __name__ == '__main__':unittest.main()
测试结果:
➜ python -m unittest DEMO4
....
----------------------------------------------------------------------
Ran 4 tests in 0.000sOK
文档测试
doctest模块:可提取注视中的代码并执行测试
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def fact(n):'''计算 1*2*3*...*n>>> fact(1)1>>> fact(-1)Traceback (most recent call last):File "/Pratice/demo.py", line 13, in <module>print(fact(-1))File "/Pratice/demo.py", line 7, in factraise ValueErrorValueError>>> fact(10)3628800'''if(n < 1):raise ValueErrorif(n == 1):return 1return n * fact(n-1)if __name__ == '__main__':import doctestdoctest.testmod()
相关文章:
iOS开发——手势识别器(用手势实现图片旋转和缩小放大)
iOS开发中,除了有关触摸的这组方法来控制用户的手指触控外,还可以用UIGestureRecognize的衍生类来进行判断,方便了开发。 UIGestureRecognize的子类类别有以下几种: UITapGestureRecognizer //轻拍识别器UIPinchGestureRecognize…
直播APP常用动画效果
作者: 落影loyinglin 地址: http://www.jianshu.com/p/a9a201ed3aa8 介绍 记录、总结开发遇到一些问题,大家一起交流学习。 这次带来,对直播APP的常用动画总结。 效果展示 下面是一个很多平台都有的入门豪华礼物动画——烟花。 一个复杂的礼物动画&…

windows8下安装Visual Studio2008
windows8下安装Visual Studio2008是一个比较麻烦的事情,不过经过我3个小时的奋斗终于安装成功了。这是我安装Visual Studio 2008过程中遇到的最复杂的一次。 下面我用图解的方式,一步一步的说明安装Visual Studio2008的过程。 第一步:因为win…

[SDK文档]SDK简介
文档链接:https://docs.growingio.com/docs/sdk-integration SDK工作方式 主要内容:GIO采集内容,数据安全措施,针对数据采集的控制项 JS SDK 添加GIO跟踪代码于<head>...</head> 之间异步加载,不影响网…

mysql主从库配置ps:mysql5.6
1 Mysql cluster版本主从服务器搭建实践 主从的作用:MySQL的主从服务器可以满足同步数据库,同步表,同步表内容,也可以指定仅同步某个数据库或某个表,还可以排除不同步某个数据库某个表。 同步原理:主从数据…

XCODE 4.5 IOS多语言设置
转:http://blog.csdn.net/samuelltk/article/details/8480403 前些天升级到Xcode4.5,现在正在用Xcode4.5IOS6开发项目,当使用国际化时,遇到了一点问题,之前版本Xcode上新建Localizable.strings后,添加语言的…
socket第三方库 AsyncSocket(源码注释解读.转)
作者 OneTea 关注 2016.09.19 11:33* 字数 0 阅读 83评论 0喜欢 1#import <Foundation/Foundation.h> class AsyncSocket;//async异步的 synchro同步 class AsyncReadPacket; class AsyncWritePacket; //extern来说可以理解为扩展吧是这样的是从一个类扩展到另一个类中的…

【每日一学】复杂度分析
文章目录目标什么是数据结构复杂度分析目标 建立时间复杂度、空间复杂度意识,写出高质量的代码能够设计基础架构提高编程技能训练逻辑思维 什么是数据结构 广义:一组数据的存储结构 | 操作数据的一种方法 解决问题:如何更快更省的处理数据…

noip2010提高组3题题解 by rLq
本题地址http://www.luogu.org/problem/show?pid1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气…

hdu 1306(字符串匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid1306 思路:一开始还以为是求最长公共序列呢。。。仔细一看,orz.....就是求两个串匹配时公共部分字符最多相同的个数。。。 View Code 1 #define _CRT_SECURE_NO_WARNINGS2 #include<…

iOS之使用CoreImage进行人脸识别
更新 :应各位朋友的需求,补上了OC版本的demo, OC版下载地址 另外附上 : swift版下载地址 CoreImage是Cocoa Touch中一个强大的API,也是iOS SDK中的关键部分,不过它经常被忽视。在本篇教程中,我会带大家一起…

[HTTP协议]入门篇
文章目录http的前世今生1. 史前时期2. 创世纪3. 从产生到发展HTTP是什么与HTTP相关的各种概念与HTTP相关的技术TCP/IP协议栈http的前世今生 1. 史前时期 20世纪60年代,美国国防部高等研究计划署ARPA建立ARPA网,四个分布在各地的节点20世纪70年代&#…

CSS中实现DIV容器垂直居中
1.vertical-align:middle 垂直对齐 如表格元素中的<td>、<th>、<caption>等,而像<DIV>、<span>这样的元素是没有valign特性的,因此使用vertical-align对它们不起作用。 2.text-align:center 文本水平居中 一、…
如何制作自己的CocoaPod库
作者 OneTea 关注 2016.12.29 18:02* 字数 848 阅读 102评论 0喜欢 6制作流程图: 流程图1.将代码托管在github上 1.1本地代码 如图: Snip20161228_7.png在github上创建 并上传 Snip20161228_3.png切换到本地项目cd xxx路径后 用git命令行 (…

【HTTP协议】域名
1. 域名的出现 IP协议将物理网卡的MAC地址抽象转化为4位数字数字化的IP地址对人不友好,需要友好的域名便于人类识别标记 2. 域名的形式 域名是一个有层次的结构——一串用’.分隔的多个单词【主机名.二级域名.顶级域名】最左边是主机名【eg:www提供万…

iOS 多级下拉菜单
前言 App 常用控件 -- 多级下拉菜单, 如团购类, 房屋类, 对数据进行筛选. 有一级, 二级, 三级, 再多就不会以这种样式,呈现给用户了. 作者就简单聊一下 多级下拉菜单 二级下拉筛选菜单.png一 目标 默认显示一个 TableView, 点击数据后, 添加第二个TableView, 并实现大小变化第二…

fork有啥用
#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(){ pid_t pid1; pid_t pid2; pid1 fork(); pid2 fork(); printf("pid1:%d, pid2:%d\n", pid1, pid2);}输出:pid1:3411, pid2:3412 //父进…

Html Agility Pack基础类介绍及运用
Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:) 基础类和基础方法介绍 Html Agility Pack最常…

【Python自动化测试】setuptools
setuptools Python标准的打包分发工具使用简单的setup.py文件,将Python应用打包 最基础的setup.py文件 #!/usr/bin/env python3 # -*- coding: utf-8 -*- from setuptools import setup setup(nameMyDemo, # 应用名version1.0, # 版本号packages[myd…

企业级-Mysql双主互备高可用负载均衡架构(基于GTID主从复制模式)(原创)
前言:原理与思想这里选用GTID主从复制模式Mysql主从复制模式,是为了更加确保主从复制的正确性、健康性与易配性。这里做的是两服务器A,B各有Mysql实例3310,两个实例间互为主从主从复制模式采用GTID主从复制模式,在服务器A,B上配置…

Objective-C自动生成文档工具:appledoc
作者 iOS_小松哥 关注 2016.12.13 15:47* 字数 919 阅读 727评论 10喜欢 35由于最近琐事比较多,所以好久没有写文章了。今天我们聊一聊Objective-C自动生成文档。 做项目的人多了,就需要文档了。手工写文档是一件苦差事,但是我们也有从源码中…

void main()是错的!
很多人甚至市面上的一些书籍,都使用了void main( ),其实这是错误的。C/C中从来没有定义过void main( )。C之父Bjarne Stroustrup在他的主页上的FAQ中明确地写着The definition void main( ) { /* ... */ } is not and never has been C, nor has it even…

Some tips
VScode自动换行 Code -> Perference -> Setting [ “editor.wordWrap”: “on” ]

iOS 自定义转场动画初探
最近项目刚迭代,正好闲下来捣鼓了一下iOS的自定义转场的效果。闲话不多说,直接开始上代码吧。(ps:请忽略实际的转场效果,关注技术本身呢哦。pps:主要是转场的动画做的比较low啦!) 1、首先定义一个转场动画的…

Delphi实现WebService带身份认证的数据传输
WebService使得不同开发工具开发出来的程序可以在网络连通的环境下相互通信,它最大的特点就是标准化(基于XML的一系列标准)带来的跨平台、跨开发工具的通用性,基于HTTP带来的畅通无阻的能力(跨越防火墙)。WebService给我们的软件开发带来了诸多好处,但是有一点还是必须要考虑到…

【Linux学习笔记】 - 什么是Linux?
Linux Linux内核 GNU工具 组成部分 Linux内核GUN工具图形化桌面环境应用软件 Linux内核 地位:Linux核心,控制计算机系统上的所有硬件和软件。必要时,分配硬件,并根据需要执行软件 主要功能: a. 系统内存存储 ——…

【转】 Android快速开发系列 10个常用工具类 -- 不错
原文网址:http://blog.csdn.net/lmj623565791/article/details/38965311 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自【张鸿洋的博客】 打开大家手上的项目,基本都会有一大批的辅助类&a…

CollectionView侧滑刷新
作者 SoDoIt 关注 2017.03.05 16:39 字数 33 阅读 31评论 0喜欢 2ABSideRefresh.gif效仿MJRefresh写的侧滑刷新,原理不讲了,需要的直接看代码 GitHub:https://github.com/wangjingyu0018/ABRefresh.git

函数功能MATLAB
近期一直在查找函数功能之类的题问,现在正好有机会和大家享共一下. 百科名片 录目 简介开展程历要主功能新特性版本分析特色优势开展简介开展程历要主功能新特性版本分析特色优势开展编辑本段 简介 matlab开辟任务面界 编辑本段 开展程历 编辑本段 要主功能 1.数值析分 2.数值和…

[HTTP协议]基础篇-待完结
文章目录输入网址后回车输入网址后回车 简单的浏览器HTTP请求过程: 浏览器从地址栏输入中获取服务器IP地址和端口号浏览器用TCP的三次握手与服务器建立连接浏览器向服务器发送拼好的报文服务器收到报文后处理请求,同样拼好报文再发给浏览器浏览器解析报…