2016-04-14 36 views
1

我有一個功能:返回不同數量的實體

def foo(): 
    try: 
     a = bar1() 
     b = bar2() 
    except Exception as e: 
     logging.exception(e) 
     return 
    return a, b 

正如你可以看到有可能會返回不同數目的值。 根據進一步,我應該仔細檢查它:

if foo(): 
    x, y = foo() 

但似乎有一些開銷。 這樣的做法好嗎?任何替代品?

對於兩個變量都應該返回None以阻止雙重執行?

+4

我會保持返回一致。如果你的方法被期望* always *返回兩個值,並且你正在捕獲一個異常並且仍然​​期望返回* something *,那麼我會同意返回'None,None'。 – idjaw

+0

或'x = foo();如果x:a,b = x' – khelwood

回答

0

我認爲最好的解決方案是不抓住Exception本身,讓異常從調用函數中處理。但是,這並不總是需要的。所以,如果提出Exception,我會從except塊中返回None

如果你仍然不希望發生這種情況(即解決你的開銷問題),我建議你從except塊中簡單地輸入pass,然後讓函數返回None,None

+0

「從except塊返回無」。這將導致必須從調用函數處理的不一致。期望是'a,b'。所以它應該堅持規則集並返回'None,None'。 – idjaw

+0

是的,這就是爲什麼我建議返回None,None來解決開銷問題@idjaw。 –

2

這打敗了Exception的目的。儘量遵循以下原則:

  1. 如果有一個例外,除非你知道到底如何處理它, 不抓住它
  2. 你也可以繼承Exception特定情況下的例外
  3. 決不使用捕獲所有的塊一樣,你有
  4. 保存返回值從

考慮一致的方法這個:

class SpecificException(Exception): 
    pass 


def foo(): 
    a = bar1() 
    b = bar2() 
    return a, b 

try: 
    a, b = foo() 
except SpecificException as e: 
    logging.exception(e) 
    handle(e) 
相關問題