设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

隐藏的Bug和乐趣:动态捕获Python异常

2013-5-13 10:34| 发布者: joejoe0332| 查看: 1866| 评论: 0|原作者: skylline, ajeelee|来自: oschina

摘要:   在讨论动态捕获异常时让我大吃一惊的是,可以让我找到隐藏的Bug和乐趣...   有问题的代码   下面的代码来自一个产品中看起来是好的抽象代码-slightly(!) .这是调用一些统计数据的函数,然后进行处理 . 首 ...

  在讨论动态捕获异常时让我大吃一惊的是,可以让我找到隐藏的Bug和乐趣...

  有问题的代码

  下面的代码来自一个产品中看起来是好的抽象代码 - slightly(!) .这是调用一些统计数据的函数,然后进行处理 . 首先是用socket连接获取一个值,可能发生了socket错误.由于统计数据在系统中不是至关重要的,我们只是记一下日志错误并继续往下走.

  (请注意,这篇文章我使用doctest测试的 - 这代表代码可以运行!)

01>>> def get_stats():
02...     pass
03...
04>>> def do_something_with_stats(stats):
05...     pass
06...
07>>> try:
08...     stats = get_stats()
09... except socket.error:
10...     logging.warning("Can't get statistics")
11... else:
12...     do_something_with_stats(stats)

  查找

  我们测试时并没有发现不妥, 但实际上我们注意到静态分析报告显示一个问题:

1$ flake8 filename.py
2filename.py:351:1: F821 undefined name 'socket'
3filename.py:352:1: F821 undefined name 'logging'

  显然是我们没测试,这个问题是代码中我们没有引用socket 和 logging 两个模块.使我感到惊奇的是,这并没有预先抛出NameError错,我以为它会查找这些异常语句中的一些名词,如它需要捕捉这些异常,它需要知道些什么呢!

  事实证明并非如此,异常语句的查找是延迟完成的,只是评估时抛出异常. 不只是名称延迟查找,也可以定制显示声明异常做为'参数(argument)'.

  这可能是好事,坏事,或者是令人厌恶的.

  好事(上段中提到的)

  异常参数可以以任意形式数值传递. 这样就允许了异常的动态参数被捕获.

01>>> def do_something():
02...    blob
03...
04>>> def attempt(action, ignore_spec):
05...     try:
06...         action()
07...     except ignore_spec:
08...         pass
09...
10>>> attempt(do_something, ignore_spec=(NameError, TypeError))
11>>> attempt(do_something, ignore_spec=TypeError)
12Traceback (most recent call last):
13  ...
14NameError: global name 'blob' is not defined

  坏事(上段中提到的)

  这种明显的弊端就是异常参数中的错误通常只有在异常触发之后才会被注意到,不过为时已晚.当用异常去捕获不常见的事件时(例如:以写方式打开文件失败), 除非做个一个特定的测试用例,否则只有当一个异常(或者任何异常)被触发的时候才会知道, 届时记录下来并且查看是否有匹配的异常, 并且抛出它自己的错误异常 - 这是一个NameError通常所做的事情.

01>>> def do_something():
02...     return 1, 2
03...
04>>> try:
05...     a, b = do_something()
06... except ValuError:  # oops - someone can't type
07...     print("Oops")
08... else:
09...     print("OK!")   # we are 'ok' until do_something returns a triple...
10OK!


酷毙
1

雷人

鲜花

鸡蛋
1

漂亮

刚表态过的朋友 (2 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部