2011-10-07 82 views
0

日益複雜/壓痕嵌套的try-S我有這樣的代碼:如何避免在Python

try: 
    request=parse_request 
except: 
    print "cannot parse your malformed request" 
    exit() 
else: 
    try: 
     fh=a_factory_function() 
    except: 
     print "cannot create object" 
    else: 
     if request['operation']=='search': 
      pass 
     elif request['operation']=='more_like_this': 
      pass 
     elif request['operation']=='list_files': 
      pass 
     elif request['operation']=='update': 
      pass 
     else: 
      print 'unsupported operation' 

在目前的形式,它具有壓痕

  1. 兩個層面解析請求
  2. 工廠函數生成一個對象來處理請求

我可以輕鬆地imagin這將會達到4個級別,並且對於我們的弱點推理而言過於複雜。是否有Pythonic的方式來壓扁縮進,並使其「線性」?

回答

1

除非我錯誤地解釋了代碼,否則您正在使用try語句的else子句進行正常處理。實際上,你正在模擬帶有異常的返回碼錯誤處理。爲什麼不這樣做?

try: 
    request=parse_request 
    fh=a_factory_function() 
except MalformedRequestError: 
    print "cannot parse your malformed request" 
    exit() 
except CreateObjectError: 
    print "cannot create object" 
    exit() 

if request['operation']=='search': 
    pass 
elif request['operation']=='more_like_this': 
    pass 
elif request['operation']=='list_files': 
    pass 
elif request['operation']=='update': 
    pass 
else: 
    print 'unsupported operation' 

這裏有在計算器上的好answer by Blair Conrad這可以解釋爲什麼您可能希望使用else條款。

0

在這種情況下,你叫exit()追趕上最高水平的異常後,這樣你就可以這樣來做:

try: 
    request=parse_request 
except: 
    print "cannot parse your malformed request" 
    exit() 
try: 
    # and so on 
0

保留功能/腳本,每次失敗後(如你的第一次失敗做的) - 那麼你不需要縮進下面的代碼,因爲在失敗後它不可能運行。

根據代碼的位置,您想要raise您自己的自定義錯誤或return而不是退出。

try: 
    request=parse_request 
except: 
    print "cannot parse your malformed request" 
    exit() 
try: 
    fh=a_factory_function() 
except: 
    print "cannot create object" 
    exit() 
if request['operation']=='search': 
    pass 
elif request['operation']=='more_like_this': 
    pass 
elif request['operation']=='list_files': 
    pass 
elif request['operation']=='update': 
    pass 
else: 
    print 'unsupported operation' 
2

Errors should not pass silently。如果你問我,在這種情況下打印一條消息而不是引發異常就算「默默地」。

調用exit()更糟糕 - 無論何時調用函數,無論導入的庫有多深,格式錯誤的請求都會終止程序。

的更Python替代打印的消息則忽略erorr,或調用exit(),就是爲了讓這段代碼捕獲的呼叫者異常並處理它。在這個函數中你不需要任何異常處理。

如果您需要區分分析錯誤和對象創建錯誤,請提出自定義ParseErrorObjectCreationError並讓調用方處理。 正如其他答案所示,如果一個塊以raise(或exit()return)結尾,則不需要在其後面加一個縮進的else塊。

+0

似乎對我來說是最合理和pythonic。 – Glider