2017-03-07 61 views
0

我有一套复杂的条件,从中我想退出,一旦遇到。使用异常作为pythonic方法吗?

为此,我想使用它们周围的try:/except:结构在正确的时间退出,这与goto类似。令人费解的一个例子(使用raisebreakwhile)将是:

class Minor(Exception): 
    pass 
class Major(Exception): 
    pass 

age = 15 
while True: 
    try: 
     if age > 18: 
      raise Major 
     else: 
      raise Minor 
    except Major: 
     print('major') 
     break 
    except Minor: 
     print('minor') 
     break 

就是这样异常的使用Python的?换句话说:是否只是为了捕获本来会是Traceback的异常,还是像上面那样有一般用途?

编辑:下面的评论,我想澄清一点,我不看如何简化这段特定的代码 - 真正的代码更复杂的嵌套循环和条件。 我感兴趣的部分是是否有理由特别阻止异常的使用。

+4

不可以。为什么将你正在引发的代码封装在'except'块中而不是将它放在'if'语句或函数调用中是有意义的? –

+1

这对我来说看起来并不是很pythonic。如果带有'break'语句的elif块会不够吗? –

+0

@PatrickHaugh:我认为你评论中的'不'意思是'不,这不是pythonic'?至于你的问题:我的真实情况要复杂得多,有一组fors和whiles,一旦遇到一组标准,我想逃离这些组合。提出例外是我设想的解决方案。 – WoJ

回答

4

不,这不是pythonic途径。用于立即从嵌套循环转义的流控制的常用方法是将逻辑放入函数并使用return语句。

PEP 3136一度被提议作为一种方法使用标记突破从嵌套循环逃避和continue语句:

标记的突破,并继续可以提高可读性和复杂的代码,它使用嵌套循环的灵活性。

这个PEP被Python 3.1拒绝了。圭多wrote

我拒绝它的理由是代码,这样复杂 需要此功能上是非常罕见的。在大多数情况下,现有的 变通办法产生干净的代码,例如使用“返回”。