错误及调试

错误及调试

标签(空格分隔):


错误处理

通常利用try...except... finally...语句进行错误处理。

try

try:    #在可能出错的地方添加`try`,如果出错就跳转到`except`
    print('try.......')
    r = 10/0
    print('r = ', r)
except ZeroDivisionError as e:  #在出现错误或异常后,由except捕捉,并处理。
    print('except:', e)
finally:    #上述过程结束后,finally语句一定会被执行。
    print('finally......')

print('end')

如果需要捕捉多个异常,那么就需要使用多个except进行捕获,分别进行处理。

调用栈

如果出现的错误一直没有被捕获,那么就会一直网上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。

def foo(s):
    return 10/int(s)
def bar(s):
    return foo(s)*2
def main():
    bar('0')

main()

解释器会逐层上抛错误,并且打印错误信息。
按照每个栈的信息寻找错误。

def main():
    try:
        bar('0')
    except Exception as e:
        logging.exception(e)

这样在出错后会打印信息并且执行完程序,而不会退出。
通过配置,logging还可以吧错误记录到日志文件里。

抛出错误

因为错误是class,捕获错误就是捕获该class的一个实例。
raise就可以自己抛出一个错误,自己定义一个错误的class,并选择合适的继承关系。

class FooError(ValueError):
    pass
def foo(s):
    n = int(s)
    if n==0:
        raise FooError('invalid value : %s' % s)
    return 10/0

foo('0')

另外一种方法:

def bar():
    try:
        foo('0')
    except ValueError as e:
        print('ValueError!')
        raise

再出现错误之后,只是记录错误,但是在函数中无法处理,就继续上抛raise该错误。

调试

assert断言。

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

assert第一项表达式如果是True就继续,否则后面就会出错,assert本身抛出AssertionError:并且打印assert后面的内容。

在Python解释器中可以使用-0参数关闭assert:

$ python -O err.py  #关闭后,所有的assert语句都可以看成pass。
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero

logging

使用logging是第三种方法,和assert相比,logging不会抛出错误,但是可以输出到文件。

import logging
s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10/n)

这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

pdb

第四种方法就是启用Python的pdb,让程序以单步方式运行,可以随时查看运行状态。

在调试器中使用

python -m pdb [文件.py]
就可以单步执行文件,
输入命令l查看代码,
输入命令n执行下一步,
命令p 变量名可以查看变量。
q结束调试,退出程序。

可以在程序中加入pdb.set_trace()设置一个断点。可以用p查看变量,c继续运行。

单元测试

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

比如对函数abs(),我们可以编写出以下几个测试用例:

  1. 输入正数,比如1、1.2、0.99,期待返回值与输入相同;
  2. 输入负数,比如-1、-1.2、-0.99,期待返回值与输入相反;
  3. 输入0,期待返回0;
  4. 输入非数值类型,比如None、[]、{},期待抛出TypeError。
    把上面的测试用例放到一个测试模块里,就是一个完整的单元测试。

如果单元测试通过,说明我们测试的这个函数能够正常工作。如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过。

import unittest

from mydict import Dict

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 test_keyerror(self):
        d = Dict()
        with self.assertRaises(KeyError):
            value = d['empty']

    def test_attrerror(self):
        d = Dict()
        with self.assertRaises(AttributeError):
            value = d.empty

为了编写单元测试,我们需要引入Python自带的unittest模块,编写mydict_test.py如上,
编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。
test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。

文档测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值