最近学习了python的错误处理和几种测试方法

1 try except

可以通过try except方式捕捉异常

try:
print('try...')
r = 10/0
print('result is :', r)
except ZeroDiversionError as e:
print('except is :', e)
finally:
print('finally ...')
print('END')

  可以捕捉不同类型的错误,编写多个except

try:
print('try...')
r = 10/int('a')
print('result is: ', r)
except ValueError as e:
print('ValueError : ', e)
except ZeroDiversionError as e:
print('ZeroDivisionError is : ', e)
finally:
print('finally ...')
print('END')

  try except同样支持else结构

try:
print('try... ')
r = 10/int('2')
print('result is : ', r)
except ValueError as e:
print('ValueError : ', e)
except ZeroDivisionError as e:
print('ZeroDivisionError is : ', e)
else:
print('no error')
finally:
print('finally ...')
print('END')

  某个函数调用出现异常,在上层同样可以捕获到

def foo(s):
return 10/int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
print('Exception is : ', e)
finally:
print('finally...')
main()

  

2 logging

python 提供打日志方式输出异常,并且不会因为出现异常导致程序中断

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')

  

如果想要将异常处理的更细致,可以自定义一个异常类,继承于几种错误类,如ValueError等,在可能出现问题的地方将错误抛出来

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

  错误可以一层一层向上抛,直到有上层能处理这个错误为止

def foo(s):
n = int(s)
if n==0:
raise ValueError('invalid error is: %s' %s)
return 10/n
def bar():
try:
foo('0')
except ValueError as e:
print('ValueError')
raise
bar()

  logging可以设置不同的级别,通过basicConfig可以设置

import logging
logging.basicConfig(level=logging.INFO)
def foo(s):
n = int(s)
return 10/n
def main():
m = foo('0')
logging.info('n is : %d' %m)
main()

  

3 断言assert

大部分语言都支持assert,python也一样,在可能出错的地方写assert,会在异常出现时使程序终止

def foo(s):
n = int(s)
assert n != 0 ,'n is zero'
return 10/n
def main():
foo('0')
main()

 

4 pdb调试和set_trace

pdb调试用 python -m pdb 文件名.py, 单步执行敲n,退出为q
python 可以在代码里设置断点,在程序自动执行到断点位置暂停,暂停在set_trace的代码行

 

import pdb
def foo(s):
n = int(s)
pdb.set_trace()
return 10/n
def main():
m = foo('0')
main()

  

5 单元测试

先实现一个自己定义的Dict类,将文件保存为mydict.py

class Dict(dict):
def __init__(self, **kw):
super(Dict, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except Exception as e:
raise AttributeError('AttributeError is :%s', e)
def __setattr__(self, key, value):
self[key] = value

  python 提供了单元测试的类,开发者可以继承unittest.Test实现特定的测试类,下面实现Dict的单元测试类,保存为unittestdict.py

import unittest
from mydict import Dict
class TestDict(unittest.TestCase):
def setUp(self):
print('setUp...')
def tearDown(self):
print('tear Down...')
def test_init(self):
d = Dict(a='testa', b = 1)
self.assertEqual(d.a, 'testa')
self.assertEqual(d.b, 1)
self.assertTrue(isinstance(d, dict))
def test_key(self):
d = Dict()
d['name'] = 'hmm'
self.assertEqual(d.name, 'hmm')
def test_attr(self):
d = Dict()
d.name = 'hmm'
self.assertEqual(d['name'], 'hmm')
self.assertTrue('name' in d)
def test_attrerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d.empty def test_keyerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d['empty'] if __name__ == '__main__':
unittest.main()

  运行unittest.py可以检测mydict中Dict类是否有错误

6 文档测试

文档测试在代码中按照特定格式编写python输入和期待的输出,通过python提供的文档测试类,实现测试代码的目的

class Dict(dict):
'''
>>> d1 = Dict()
>>> d1['x'] = 100
>>> d1.x
100
>>> d1.y = 200
>>> d1['y']
200
>>> d2=Dict(a=1,b=2,c='m')
>>> d2.c
'm' '''
def __init__(self, **kw):
super(Dict,self).__init__(**kw)
def __getattr__(self,key):
try:
return self[key]
except KeyError:
raise AttributeError('AttributeError key is %s' %key)
def __setattr__(self,key,value):
self[key] = value
if __name__ == '__main__':
import doctest
doctest.testmod()

  我的公众号谢谢关注:

python学习(十一)测试和调试的更多相关文章

  1. python学习笔记012——pdb调试

    1 描述 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能, 主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等 调 ...

  2. python学习笔记之pdb调试

    之前一直说要学python可还是一直停留在看的层面,昨天大神手把书教我pdb调试,说要摆脱IDE集成开发环境编程,感激不尽,立一个flag,python一定要入门! 1.进入方式 1)windows ...

  3. python django 基本测试 及调试

    #########20181110from django.db import modelsfrom blog.models import Article, Author, TagAuthor.obje ...

  4. 使用Python学习selenium测试工具-4:查找元素

    转自:https://blog.csdn.net/wd168/article/details/51819930 web通常包含了Hyper Text Markup Language (HTML).Ca ...

  5. Python学习--12 异常处理、调试

    异常捕获 语法格式: try: pass except xxx as e: pass except xxx as e: pass ... else: pass finally: pass except ...

  6. python django 基本测试 及调试 201812

    #####20181225 1.python解决SNIMissingWarning和InsecurePlatformWarning警告在想要获取https站点的资源时,会报出SNIMissingWar ...

  7. 【转】使用Python学习selenium测试工具

    出处:https://my.oschina.net/u/1433482/blog/633231?fromerr=vaxqh9bn

  8. 转 Python3 错误和异常/ Python学习之错误调试和测试

    ########sample 0 https://www.cnblogs.com/Simon-xm/p/4073028.html except: #捕获所有异常 except: <异常名> ...

  9. python学习笔记(六)——程序调试

    在我们平时编写程序时,常常会遇到各种错误,俗称BUG.而我们程序猿的工作常常需要对程序进行调试,也就是所谓的debug. 程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法 ...

随机推荐

  1. python-redis哈希模式

    命令: hset   info name hgetall info hkeys info hvlls  info m系列批量处理: ---------------------------------- ...

  2. python基础-02-while格式化逻辑运算

    python其他知识目录 1.循环打印“我是小马过河” while True:    print('我是小马过河') #4.用while从一打印到10 #5.请通过循环,1 2 3 4 5 6 8 9 ...

  3. Centos7 Zabbix添加主机、图形、触发器

    制作自定义key zabbix自带模板Template OS Linux (Template App Zabbix Agent)提供CPU.内存.磁盘.网卡等常规监控,只要新加主机关联此模板,就可自动 ...

  4. 根据Unicode码生成汉字

    最近需要一批汉字字符数据,类似数字字符与ASCII码之间的对应关系,汉字字符与Unicode码之间也存在对应关系. 所以可以遍历Unicode码批量生成汉字. 其中,汉字为宽字符,输出时候注意需要修改 ...

  5. lambda(匿名函数)---基于python

    在学习python的过程中,lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda? 下面就上面的问题进行一下解答. 1.lambda是什么? ...

  6. 你应该知道的PHP库

    Libchart – 这也是一个简单的统计图库. JpGraph – 一个面向对象的图片创建类. Open Flash Chart – 这是一个基于Flash的统计图. RSS 解析 解释RSS并是一 ...

  7. Asphalting Roads(翻译!)

    Description City X consists of n vertical and n horizontal infinite roads, forming n × n intersectio ...

  8. Scrum立会报告+燃尽图 03

    此作业要求:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2190] 一.小组介绍 组长:王一可 组员:范靖旋,王硕,赵佳璐,范洪达,祁 ...

  9. MacOS下安装Requests库及使用

    大概框架 Request库的安装 爬取网页最好用的第三方库 直接安装即可(用于OS X) pip3 install requests request库的常用方法: request库一共有七个常用方法. ...

  10. PHP面向对象之抽象类,抽象方法

    抽象类,抽象方法 抽象类: 是一个不能实例化的类: 定义形式: abstract  class  类名{} 为什么需要抽象类: 它是为了技术管理而设计! 抽象方法: 是一个只有方法头,没有方法体的方法 ...