最近学习了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. 多主机Docker容器的VLAN划分

    原文发表于cu:2016-06-06 参考文档: Docker网络的4种模式,pipework/ovs的简单使用等:http://www.infoq.com/cn/articles/docker-ne ...

  2. 算法笔记(c++)--01背包问题

    算法笔记(c++)--经典01背包问题 算法解释起来太抽象了.也不是很好理解,最好的办法就是一步步写出来. 背包问题的核心在于m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+ ...

  3. python实现lower_bound和upper_bound

    由于对于二分法一直都不是很熟悉,这里就用C++中的lower_bound和upper_bound练练手.这里用python实现 lower_bound和upper_bound本质上用的就是二分法,lo ...

  4. ASP.NET 异步Web API + jQuery Ajax 文件上传代码小析

    该示例中实际上应用了 jquery ajax(web client) + async web api 双异步. jquery ajax post $.ajax({ type: "POST&q ...

  5. 华为ensp使用

    网络学习目录 AR是() Auto:自动线 copper:双绞线缆  serial:串行线  pos: 光纤  E1:    ATM:    CTL:       STA:    PC:    MCS ...

  6. CF刷刷水题找自信 2

    CF 1114A  Got Any Grapes(葡萄)? 题目意思:给三个人分葡萄,三个人对葡萄的颜色有一些要求,问所准备的三种颜色的葡萄能否满足三人的要求. 解题意思:直接按条件判断即可. #in ...

  7. 安装cocoa pods

    1.移除现有Ruby默认源 $gem sources --remove https://rubygems.org/ 2.使用新的源 $gem sources -a https://ruby.taoba ...

  8. [转]精选!15个必备的VSCode插件

    Visual Studio Code 是由微软开发的一款免费.跨平台的文本编辑器.由于其卓越的性能和丰富的功能,它很快就受到了大家的喜爱. 就像大多数 IDE 一样,VSCode 也有一个扩展和主题市 ...

  9. Access连接数据源配置(新手必知)

    今天要连接Access时发现win7 64位旗舰版控制面板中管理工具下的数据源(ODBC)配置竟然只有SQLServer的驱动,其他的都没有了,这可不好玩!上网百度了一番,有人也遇过这样的问题,我在此 ...

  10. 期中HTML代码及技术博客

      <!DOCTYPE html>   <html lang="en">   <head>   <meta charset="U ...