'''
try
'''
from asyncio.test_utils import TestCase
try:
print('try...')
r = 20 / 0
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
try:
print('try...')
r = 20 / int('a')
print('result:', r)
except ValueError as e:
print('ValueError', e)
finally:
print('finally...')
print('END')
'''
调用堆栈
如果错误没有被捕捉,它就会一直向上抛,最后被Python解释器步骤,打印一个错误信息然后退出
'''
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
'''
记录错误
logging
'''
import logging
def foo(s):
return 0 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar(0)
except Exception as e:
logging.exception(e)
'''
抛出错误
因为错误是class, 捕获一个错误就是捕获到该class的一个实例。因此, 错误不是凭空产生的而是有意创建并抛出的。
Python的内置函数会抛出很多类型的错误,我们自己编写也可以抛出错误
如果要抛出错误,首先根据需要们可以定义一个错误的class, 选择好继承关系,然后,用raise语句抛出一个错误实例
'''
class FooError(ValueError):
pass
def foo(s):
n = int(s)
if n == 0:
raise FooError('invalid value: %s' % s)
return 10 / n
'''
调试
print()方法打印
断言
assert
logging
IDE断点调试
'''
def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n
def main():
foo('0')
import logging
s = '0'
n = int(s)
logging.info('s = %d' % n)
'''
单元测试
测试方法必须为test开头
setUp()和tearDown()方法会在测试的时候前后调用(例如测试数据库打开关闭)
小结
单元测试可以有效测试某个程序莫阔的行为,是未来重构代码的信息保证
单元测试的测试用例要覆盖常用的输入组合,边界条件和异常
单元测试代码要非常简单,如果测试代码复杂,那么测试代码本身就可能存在bug
单元测试通过了并不意味着程序没有bug了,但是不通过一定是有bug
'''
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 hs no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
import unittest
class TestDict(unittest.TestCase):
def test_init(self):
d = Dict(a=1, b='test')
self.assertEqual(d.a, 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 setUp(self):
print('setUp...')
def tearDown(self):
print('tearDown...')
更多精彩内容访问个人站点www.gaocaishun.cn