python 内置了一套try...except...finally...的错误处理机制;
try:
print 'try'
r = 10 / 0
print 'result:', r
except ZeroDivisionError, e:
print 'except:', e
finally:
print 'finally'
结果:
try
except: integer division or modulo by zero
finally
此外,如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句:
try:
print 'try'
r = 10 / 1
print 'result:', r
except ZeroDivisionError, e:
print 'except:', e
else:
print 'no error'
finally:
print 'finally'
结果:
try
result: 10
no error
finally
Python所有的错误都是从BaseException类派生的,常见的错误类型和继承关系看这里:
https://docs.python.org/2/library/exceptions.html#exception-hierarchy
可以导入logging模块记录异常到日志文件中;
import logging
logging可以指定信息的级别:debug,info,warning,error这几个级别,你可以指定该文件的日志级别
import logging
logging.basicConfig(level=logging.INFO)
logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件
rasie将错误进行抛出,这种办法不仅可以解决了不知道如何处理的情况;同时可以改变抛出错误的类型;
try:
print 'try'
r = 10 / 0
print 'result:', r
except ZeroDivisionError, e:
print 'except:', e
raise ValueError(e)
finally:
print 'finally'
结果:
try
except: integer division or modulo by zero
finally
Traceback (most recent call last):
File "F:/hz_viking/PycharmProjects/django_demo/WebBase/apps/cm/syc/varibleScope.py", line 353, in <module>
raise ValueError(e)
ValueError: integer division or modulo by zero
用assert(断言)去替代print;
def test(i):
try:
print 'try'
assert i != 0, 'i is zero' # 断言i是否为0,如果为False,就会打印后面的说明
except ZeroDivisionError, e:
print 'except:', e
raise ValueError(e)
finally:
print 'finally'
test(0)
结果:
Traceback (most recent call last):
File "F:/hz_viking/PycharmProjects/django_demo/WebBase/apps/cm/syc/varibleScope.py", line 358, in <module>
test(0)
File "F:/hz_viking/PycharmProjects/django_demo/WebBase/apps/cm/syc/varibleScope.py", line 349, in test
assert i != 0, 'i is zero'
AssertionError: i is zero
程序中如果到处充斥着assert,和print相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert
python -O err.py
为了编写单元测试,我们需要引入Python自带的unittest模块:
import unittest
class TestDict(unittest.TestCase):
def test_init(self):
d = {'java':'diffcult', 'python':'midle'}
self.assertEqual(d.get('java'), 'diffcult')
编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。
以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。
单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。
单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。
单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。
单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。