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
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。