2014-10-09 43 views
3

我有一些Python代碼,它會在數據庫爲空並放棄之前嘗試一堆不同的數據庫查詢。這裏是一個簡化的例子:什麼是一個優雅的方式來多次捕獲相同的異常?

try: 
    result = Object.get(name="requested_object") 
except Object.DoesNotExist: 
    try: 
     result = Object.get(name="default_object") 
    except Object.DoesNotExist: 
     try: 
      result = Object.get(pk=1) 
     except Object.DoesNotExist: 
      print "The database is empty!" 
      raise 

請注意,我試圖捕捉的異常是每次都是相同的。當然,必須有一種方法來做到這一點,而不必不必要的重複和嵌套。如何在沒有嵌套try ... except語句的情況下實現相同的行爲?

+1

我會看看[在這裏](http://programmers.stackexchange.com/questions/118788/is-using-nested-try-catch-blocks-an-anti-pattern)。總之,這有時是不可避免的。 – Buggabill 2014-10-09 11:44:59

回答

7
for args in [{'name':"requested_object"}, {'name':"default_object"}, {'pk':1}]: 
    try: 
     result = Object.get(**args) 
    except Object.DoesNotExist as e: 
     continue 
    else: 
     break 
else: 
    raise e 

如果您從未找到自己想要的東西,您不得不提出什麼樣的例外,您可能需要調整該部分。此外,異常值的範圍已在Python 3中更改,因此e將無法​​引發。

def result(): 
    try: 
     return Object.get(name="requested_object") 
    except Object.DoesNotExist: 
     pass 

    try: 
     return Object.get(name="default_object") 
    except Object.DoesNotExist: 
     pass 

    return Object.get(pk=1) # NB: no "try" here. If it's going to fail, let it fail 

這樣你避免過度壓痕和「心理跳躍」之類break/continue:當包裹成一個功能

2

嵌套的和複雜的控制塊更易於閱讀。

相關問題