2017-03-07 63 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

我拒絕它的理由是代碼,這樣複雜 需要此功能上是非常罕見的。在大多數情況下,現有的 變通辦法產生乾淨的代碼,例如使用「返回」。

相關問題