2016-04-14 62 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) 
相关问题