当前位置: 首页 > 面试题库 >

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

李嘉胜
2023-03-14
问题内容

行,

我过去已经看过多次,但是最近在这里有我的问题。所以,我很好奇为什么 在python中会
是这种情况,因为生成器使用异常来指示数据的结束。

如果这对于使用python的每个人来说太糟糕了,为什么该语言将其包含在基本控制结构中?对于那些想阅读相关PEP的人,请点击此处。


问题答案:

因为结束生成器不是一个常见事件(我知道它会一直发生,但只会发生 一次
)。抛出异常被认为是昂贵的。如果某个事件将在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标准库函数调用,您只捕获特定的异常。



 类似资料:
  • 问题内容: 我被分配了一个项目来开发一组用作存储系统接口的类。要求是该类支持具有以下签名的get方法: 基本上,该方法应该返回与if和仅在after之后被修改的对象相关联。如果存储系统不包含,则该方法应返回null。 我的问题是这样的: 如何处理场景的关键存在,但对象已经 不 被修改? 这很重要,因为使用此类的某些应用程序将是Web服务和Web应用程序。这些应用程序将需要知道是返回404(未找到)

  • 问题内容: 我听说对控制流使用异常是不好的做法。你觉得这怎么样? 因此,如果未找到匹配项,则整数将为-1。当我尝试使用子字符串时,这将导致异常。然后,该函数仅返回一个对象,指示未找到匹配项。 这是不好的做法吗?我可以手动检查每个索引以查看它们是否都为-1,但这感觉需要更多工作。 更新 我已经删除了try-catch块,并用以下代码替换了它: 哪个更好:检查每个变量是否为-1,还是使用布尔值进行跟踪

  • 我听到一些人说,即使在使用获得种子之后,使用也是很糟糕的。为什么会这样?我想知道事情是怎么发生的...抱歉,我又问了一个问题..但是,有什么办法可以替代这一点呢?

  • 我有一个问题,关于什么是正确的做法,使用SwingU实用程序的调用稍后方法。 所以首先,我想确认我理解正确。 据我所知,对GUI的更改必须在EDT上完成,因为Swing组件不是线程安全的。invokeLater方法将Runnable作为参数,该Runnable中包含的任何内容都将在EDT上运行。因此,对Swing组件的任何调用都被放入一种队列中,在EDT上一次执行一个。 有了这些,我的问题是:使用

  • 问题内容: 我问了一个一般性的Spring问题:自动播发Spring Bean,并让多个人回答说应尽可能避免调用Spring 。这是为什么? 我还应该如何访问配置了Spring创建的Bean? 我在非Web应用程序中使用Spring,并计划按照LiorH的描述访问共享对象。 修正案 我接受下面的答案,但这是Martin Fowler的另一种选择,他讨论了依赖注入与使用(本质上与调用相同)的优点。

  • 问题内容: 我正在开发一个网页,在那里我为类似国际象棋的游戏布置一块面板,以及几个棋盘托盘。所有操作都使用HTML(使用jQuery在游戏进行时进行动态更新)完成。在某个地方,我想到在页面中使用元素的绝对定位被认为是不好的做法,并且最好使用相对定位。 经过相对定位的困扰了很长时间之后,我意识到板元件的绝对定位要容易得多,而且要正确得多。 有谁知道相对定位优于绝对定位的原因吗?在决定采用哪种方法时,