您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python使用异常进行控制流被认为是不好的吗?

Python使用异常进行控制流被认为是不好的吗?

因为结束生成器不是一个常见事件(我知道它会一直发生,但只会发生 一次 )。抛出异常被认为是昂贵的。如果某个事件将在99%的时间内成功完成而在1%的时间内失败,那么使用try / except可能比检查是否可以访问该数据要快得多(要求宽恕比允许容易)。

由于使用这样的try / except块可能很难理解,因此也存在一些偏见。流量控制可能很难遵循,而if / else更简单。try / except意味着您必须在try 调用函数内部跟踪语句的流控制(因为它们可能会引发异常,并且可能向上传播。if/ else只能在以下位置分支:语句被评估。

有时使用try / except是正确的,而使用if / else更有意义。它们每个都有性能成本。考虑:

a = <some dictionary>
if key in a:
    print a[key]

a = <some dictionary>
try:
    print a[key]
except KeyError:
    pass

如果key在a内不存在,则第一个会变快,如果存在,则只会稍慢(几乎不明显)。如果键确实存在,则第二个将更快,但如果不存在,则第二个将慢得多。如果密钥几乎总是存在,则选择第二个。否则,第一个效果更好。

编辑:只需添加一点有关Python try / except的知识,就可以极大地解决可读性问题之一。

考虑从文件中读取。

f = None
try:
    f = open(filename, 'r')
    ... do stuff to the file ...
except (IOError, OSError):
    # I can never remember which one of these Python throws...
    ... handle exception ...
finally:
    if f:
        f.close()

现在,容器中的任何东西都do stuff to the file可能引发异常,我们将抓住它。通常,由于这个原因,您尝试在尝试中保留尽可能少的代码。Pythonelse为try提供了一个可选的子句,只有在try运行完成而没有遇到异常的情况下,该子句才会运行。

f = None
try:
    f = open(filename, 'r')
except (IOError, OSError):
    pass
else:
    ... do stuff to the file ...
finally:
    if f:
        f.close()

在这种情况下,您不会遇到任何可读性问题,因为尝试中只有一条语句;这是python标准库函数调用,您只捕获特定的异常。

python 2022/1/1 18:32:25 有206人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶