【问题标题】:Is this the correct way to raise an Exception? (Python)这是引发异常的正确方法吗? (Python)
【发布时间】:2017-08-02 00:34:29
【问题描述】:
for i in range(1,1000):
    try:
        x = some_crazy_function(my_parm(i))
        if x in massive:
            raise Exception()
        massive.append(x)
        x = dict(qnother_crazy_functionsl(x.replace('X','Y')))
        x = new_func(x['constant'])[0]
        next.append(x)
    except:
        break

我对 python 还很陌生,我在维护别人的代码的同时跑过这个片段

对我来说,这看起来像是一种可怕的退出循环的方式。 这是在 python 中编码的公认方式,我会习惯它还是像看起来一样糟糕?

【问题讨论】:

  • 当您的代码遇到异常时会引发异常。 x 在 massive 中并没有什么异常 - 当然,除非您通常期望 x not 在 massive 中。在性能方面,异常非常昂贵。所以,请改用break。
  • 使用裸except: 也是个坏主意,因为它还会捕获KeyboardInterrupt 和其他一些您可能不想捕获的东西。

标签: python exception error-handling runtime-error


【解决方案1】:

在最简单的情况下,break 将是打破循环的最佳(也是最简单)的方法:

if x in massive:
    break

但是,如果抛出和捕获异常更适合您的用例,我建议您首先定义您自己的用户定义的异常类:

class MassiveException(Exception):
    pass

接下来,你可以这样扔:

if x in massive:
    raise MassiveException()

然后像这样捕捉它:

except MassiveException:
    ... # do something here

这更好,因为它使您的意图清晰,并且还摆脱了包罗万象的情况,除了会吞下您真正不想吞下的其他异常。

【讨论】:

  • 谢谢大家。正如我所说,这看起来是一种糟糕的编码方式,而您的回答似乎会加强我的感觉。感谢代码 sn-ps 提供了更好的方法来实现这个片段。
  • 回复:接受 抱歉,虽然我理解这个概念,但我对实施一无所知。以及如何在这里获得换行符?
  • @Don 这应该会有所帮助:stackoverflow.com/help/someone-answers(另外,你不能在 cmets 中添加换行符......至少,我不知道如何:p)
猜你喜欢
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
相关资源
最近更新 更多