Python基础知识(20):错误、调试和测试

一、错误处理

在运行程序的过程中有可能会出错,一般我们会在添加一段代码在可能出错的地方,返回约定的值,就可以知道会不会出错以及出错的原因

1、使用try......except......finally......错误处理机制

try...可能会出异常的代码

except...如果try后面的代码出错,则运行这里的语句;否则直接运行finally语句

finally...无论try语句是否出错都会运行

try:
z=5/0
print("ressult=",zip)
except ZeroDivisionError:
print("The second number can't be number!")
finally:
print("I'm here.") The second number can't be number!
I'm here.

多个except语句

try:
z=5/5
print("ressult=",z)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
else:
print('No error!')
finally:
print("I'm here.")

2、记录错误

使用logging模块可以记录出错信息

通过配置,可以让logging记录出错的信息到日志,以便日后排查

#testlog.py
import logging
def test(x):
return 5/int(x)
def main():
try:
test("")
except Exception as e:
logging.exception(e) main()
print("END")

同样是出错,但程序打印完错误信息后会继续执行,并正常退出

ERROR:root:division by zero
Traceback (most recent call last):
File "D:/Python/doit/testLog.py", line 7, in main
test("")
File "D:/Python/doit/testLog.py", line 4, in test
return 5/int(x)
ZeroDivisionError: division by zero
END

3、抛出错误

使用raise语句

如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例

#testError
class testError(ValueError):
pass def test(x):
y = int(x)
if y==0:
raise testError('invalid value: %s' % x)
return 10 / y test('') Traceback (most recent call last):
File "D:/Python/doit/testError.py", line 11, in <module>
test('')
File "D:/Python/doit/testError.py", line 8, in test
raise testError('invalid value: %s' % x)
testError: invalid value: 0

注:只有为完成某些需要时我们才自己定义错误类型,日常一般使用Python内置的错误类型

二、调试

1、用print打印能出错的变量

2、断言assert

使条件为真,保证程序正常运行下去,否则抛出AssertionError

可以在条件后添加字符串,用来解释断言

def test(x):
y=int(x)
assert y!=0,"y is zero"
return 5/y def main():
test("") main() Traceback (most recent call last):
......
AssertionError: y is zero

3、logging

允许指定记录出错信息的日志级别等级:critical > error > warning > info > debug

#logErro.py
import logging
logging.basicConfig(level=logging.INFO) x=""
y=int(x)
ogging.info("y=%d"%y)
print(5/y) Traceback (most recent call last):
File "D:/Python/doit/logErro.py", line 6, in <module>
ogging.info("y=%d"%y)
NameError: name 'ogging' is not defined

4、pdb

Python调试器,需要单步执行

5、pdb.set_trace

这个方法也是用pdb,但是不需要单步执行,只需要import pdb,然后在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点

6、IDE

可以设置断点、单步执行

需要安装Python IDE

三、测试

单元测试

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

这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的

单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证

单元测试的测试用例要覆盖常用的输入组合、边界条件和异常

单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug

单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug

setUp与tearDown

可以在单元测试中编写两个特殊的setUp()tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行

文档测试

Python内置的“文档测试”(doctest)模块可以直接提取注释中的代码并执行测试

当模块正常导入时,doctest不会被执行。只有在命令行直接运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行

doctest非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含doctest的注释提取出来。用户看文档的时候,同时也看到了doctes

Python学习之旅(二十一)的更多相关文章

  1. Python学习之旅(十一)

    Python基础知识(10):函数(Ⅱ) 一.全局变量和局部变量 局部变量:在函数内定义的变量,在函数内使用 全局变量:在函数外定义的变量,在程序任何地方都可以使用 1.全局变量与局部变量同名 这时函 ...

  2. python学习笔记(二十一)构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  3. 180分钟的python学习之旅

    最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时 ...

  4. Python学习笔记(二)——列表

    Python学习笔记(二)--列表 Python中的列表可以存放任何数据类型 >>> list1 = ['Hello','this','is','GUN',123,['I','Lov ...

  5. Directx11学习笔记【二十一】 封装键盘鼠标响应类

    原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...

  6. python学习02python入门二

    学前须知:1.本文档有关内容均建立在python3.x版本上,python2.x已经成为历史,如有需要,文内会特别说明. 2.本文使用的编辑器多为架构在Windows上的pycharm,如需了解Lin ...

  7. 【Python学习笔记之二】浅谈Python的yield用法

    在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...

  8. Python学习笔记(二):条件控制语句与循环语句及常用函数的用法

    总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...

  9. Python学习系列(二)(基础知识)

    Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比, ...

  10. 滴滴Booster移动APP质量优化框架 学习之旅 二

    推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...

随机推荐

  1. hibernate JPA 使用懒加载时代理对象

    hibernate延迟加载代理对象实际对象读取方式 public static <T> T deproxy (T obj) { if (obj == null) return obj; i ...

  2. 时间序列分析 异常分析 stl

    https://blog.csdn.net/snowdroptulip/article/details/79125912 https://www.cnblogs.com/runner-ljt/p/52 ...

  3. Windows平台下nginx跨域配置

    1)下载地址: http://nginx.org 2)启动 解压至d:\nginx,运行nginx.exe(即nginx -c conf\nginx.conf),默认使用80端口,日志见文件夹D:\n ...

  4. C#指定长度截取字符串 并进行拼接。

    需求:有一个字符串需要按照指定长度拆分出来,然后在增加一个字符串拼接上. /// <summary> /// 字符串截取并拼接 /// </summary> /// <p ...

  5. redhat 7.5 更换 yum源

    因为 redhat 的 yum 是收费,所以需要换成 Centos 的 yum 才可以 首先,卸载 redhat 的 yum 软件 sudo rpm -qa|grep yum 其次,下载 Centos ...

  6. 大数据:Hive - ORC 文件存储格式

    一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...

  7. 微信小程序使用npm安装包

    小程序现在支持直接通过npm安装包了,点击这里了解更多. 记录一下我自己的安装步骤及安装过程中遇到的一些问题.希望能够帮助到正在阅读此篇文章的你~ 我就直接通过在项目根目录安装miniprogram- ...

  8. uglifyjs 合并压缩 js, clean-css 合并压缩css

    本文主要介绍如何通过CLI命令行(也就是终端或者cmd打开的那个shell窗口)实现 js和 css 的合并压缩. uglifyjs 合并压缩 js: 1.安装node 这一步就不多说了,下载node ...

  9. OraclePLSQL编程

    PL/SQL编程 pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展.pl/sql不仅允许嵌入式sql语言,还可以定义变量和常量,允许使用条件语句和 ...

  10. Android 解析未知格式的json数据

    1.递归一有的时候我们需要解析未知的json.或者说是动态的json.那么我们并不知道key具体是多少,或者说key不是固定的.这时候就需要解析动态key的方法. 这个方法是我在实现解析前台传入的js ...