Python基础之七异常与调试


'''
    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')

#print(main())

'''
    记录错误
        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)
#print(main())

'''
    抛出错误
          因为错误是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(foo('0'))

'''
    调试
        print()方法打印
    断言
        assert

    logging

    IDE断点调试


'''

def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'#True
    return 10 / n

def main():
     foo('0')

#print(main())

import logging

s = '0'
n = int(s)
logging.info('s = %d' % n)
#print(10 / 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值