使用异常作为goto是一种pythonic方法吗?

使用异常作为goto是一种pythonic方法吗?,python,Python,我有一组复杂的条件,一旦满足条件,我就想退出 为此,我想使用一个try:/except:结构围绕它们在正确的时间退出,这类似于goto。一个复杂的例子(使用从上升到中断,而是: class Minor(Exception): pass class Major(Exception): pass age = 15 while True: try: if age > 18: raise Major else:

我有一组复杂的条件,一旦满足条件,我就想退出

为此,我想使用一个
try:/except:
结构围绕它们在正确的时间退出,这类似于
goto
。一个复杂的例子(使用
上升
中断
,而
是:

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方法。用于立即从嵌套循环转义的流控制的常用方法是将逻辑放入函数并使用
return
语句

曾经有人建议使用带标签的break和continue语句从嵌套循环中转义:

标记为break和continue可以提高使用嵌套循环的复杂代码的可读性和灵活性

Python 3.1拒绝了此PEP。圭多:

我拒绝它是因为代码太复杂了 需要此功能的情况非常罕见。在大多数情况下,现有的 产生干净代码的变通方法,例如使用“return”


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

曾经有人建议使用带标签的break和continue语句从嵌套循环中转义:

标记为break和continue可以提高使用嵌套循环的复杂代码的可读性和灵活性

Python 3.1拒绝了此PEP。圭多:

我拒绝它是因为代码太复杂了 需要此功能的情况非常罕见。在大多数情况下,现有的 产生干净代码的变通方法,例如使用“return”


不。为什么把你要提出的代码封装在一个
块中而不是放在一个
if
语句或函数调用中是有意义的呢?我觉得这看起来不太像pythonic。带有
break
语句的if-elif块是否不够用?@PatrickHaugh:我假设您的评论中的“no”表示“no,这不是pythonic”的意思?至于你的问题:我的真实情况要复杂得多,有一系列的前前后后,一旦满足了一系列标准,我就想从中解脱出来。引发异常是我设想的一种解决方案。@WoJ我的解决方案通常是将其包装在一个函数中,我可以
返回
。在提供的示例中,异常的使用显然是多余的。你能给出一个更实际的上下文吗?不。为什么把你要提出的代码封装在一个
块中而不是仅仅放在
if
语句或函数调用中是有意义的呢?这在我看来不太像python。带有
break
语句的if-elif块是否不够用?@PatrickHaugh:我假设您的评论中的“no”表示“no,这不是pythonic”的意思?至于你的问题:我的真实情况要复杂得多,有一系列的前前后后,一旦满足了一系列标准,我就想从中解脱出来。引发异常是我设想的一种解决方案。@WoJ我的解决方案通常是将其包装在一个函数中,我可以
返回
。在提供的示例中,异常的使用显然是多余的。你能提供一个更实际的背景吗?