Python3入门笔记八之错误、调试和测试

330 阅读2分钟

这是我参与更文挑战的第26天,活动详情查看: 更文挑战

错误处理机制try...except...finally...

这个的使用和 java 的 try-catch-finally 差不多,只是多了个else来表示没有异常的时候,注意捕获的异常的类 要从子类到父类

try:
    print('try...')
    r = 10 / int('2')
    print('result:', r)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
else:
    print('no error!')
finally:
    print('finally...')
print('END')

# 打印结果:
# try...
# result: 5.0
# no error!
# finally...
# END

熟悉 Java 的小伙伴,是不是一眼就看出这个的不同呢,总感觉用 java 的这个 catch 会更清晰,而且可以写一个 catch 里,而这里得用很多 except 来表示不同的错误,不过这个 else 还是很突出 哈哈~

调用栈 & 记录错误

Python内置的 logging 模块可以非常容易地记录错误信息: 通过配置, logging 还可以把错误记录到日志文件里,方便事后排查。

找bug的操作一般直接定位到最后那里就可以看到了

import logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

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

main()
print('END')

# 打印结果:
# ERROR:root:division by zero
# Traceback (most recent call last):
#   File "<ipython-input-5-cc27997fe30e>", line 11, in main
#     bar('0')
#   File "<ipython-input-5-cc27997fe30e>", line 7, in bar
#     return foo(s) * 2
#   File "<ipython-input-5-cc27997fe30e>", line 4, in foo
#     return 10 / int(s)
# ZeroDivisionError: division by zero
# END

这个日志感觉也没啥特别~ 毕竟大家都是日志 😄

抛出错误

这个和java抛出异常的操作也一样(只是java里Error是没法捕获的,一般是虚拟机或系统的Error如OutOfMemoryError。异常是可以解决的,如RuntimeException等等)。

下级决定不了的Error就抛给上级,用raise语句抛出错误

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

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

bar()

这里还是有点不同的,这个错误居然还可以再往上抛~

最后

欢迎小伙伴们来一起探讨问题~

如果你觉得本篇文章还不错的话,那拜托再点点赞支持一下呀😝

让我们开始这一场意外的相遇吧!~

欢迎留言!谢谢支持!ヾ(≧▽≦*)o 冲冲冲!!

我是4ye 咱们下期应该……很快再见!! 😆