码迷,mamicode.com
首页 > 编程语言 > 详细

python学习——基础(八)

时间:2015-10-26 17:08:27      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

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。

python学习——基础(八)

标签:

原文地址:http://my.oschina.net/u/257801/blog/522170

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!