2010-10-06 151 views
1

我的工作场所规定了不使用例外的规则(允许捕捉)。如果我有这样Python:我不允许引发异常。还有其他优雅的Python方法吗?

def f1() 
if bad_thing_happen(): 
    raise Exception('bad stuff') 
... 
return something 

代码,我可以将其更改为

def f1() 
    if bad_thing_happen(): 
    return [-1, None] 
    ... 
    return [0, something] 

F1呼叫者会是这样

def f1_caller(): 
    code, result = f1(param1) 
    if code < 0: 
    return code 
    actual_work1() 
    # call f1 again 
    code, result = f1(param2) 
    if code < 0: 
    return code 
    actual_work2() 
    ... 

有没有在Python更优雅的方式比这个?

+5

告诉你我的工作地点,我讨厌他们。至于优雅的方式,那么,这将是例外....你在做什么是好的(这很像c错误代码,只是更好),但我会返回一个元组而不是一个列表。这样,你可以说成功,结果= f1(参数) – JoshD 2010-10-06 03:40:01

+16

没有例外编写C++代码是有用的理由,但没有它们编写Python代码是无稽之谈。例外是Python的绝对基础。我强烈建议寻找最近的塑料蝙蝠,并尽可能多次击中你的破坏性不称职的老板。 – 2010-10-06 03:41:26

+1

我和格伦在一起。高尔夫俱乐部虽然更好,同样的力量应用在一个较小的区域。 – dutt 2010-10-06 03:46:21

回答

3

例外在python是要避免的东西,并且往往是解决问题的简单方法。此外,一个异常带有大量的信息,可以帮助快速定位(通过堆栈跟踪)并识别问题(通过异常类或消息)。如果谁想出了这个一揽子政策,肯定会想到另一种语言(也许是C++?),其中抛出异常是一个更昂贵的操作(并且如果您的代码在20年前的计算机上执行,将会降低性能)。

要回答你的问题:另一种方法是返回一个错误代码。这意味着你将函数结果与错误处理混合在一起,这就引发了(ha!)它自己的问题。但是,返回None通常是指示功能故障的完美合理方式。

+0

当这种政策实施时,通常是由于一些幻觉的担忧。有些“高级”开发人员在某种程度上受到某种东西的影响,现在害怕它,并且迫使无理的恐惧。 – 2010-10-06 03:55:21

1

返回None是相当普遍和良好概念的作品。如果您希望得到一个返回值,并且您没有收到任何值,那么这是一个很好的迹象表明出现了问题。

另一种可能的方法是,如果您希望返回一个列表(或字典等),则返回一个空的列表或字典。这可以很容易地使用if进行测试,因为一个空的容器计算为在Python False,如果你要遍历它,你甚至可能不会需要检查它(取决于你想如果函数失败怎么办)。

当然,这些方法不告诉你为什么函数失败。所以你可以返回的例外情况,如return ValueError("invalid index")。然后,您可以使用isinstance()测试特定的例外情况(或一般情况下的例外情况)并打印它们以获取体面的错误消息。 (或者你可以提供一个帮助函数来测试返回码,看它是否来自Exception。)你仍然可以创建你自己的Exception子类;你会简单地返回而不是提高它们。

最后,我想对得到这个荒谬的政策改变,作为例外Python如何工作的一个重要组成部分的工作,具有低开销,并会利用你的函数任何人的预期。

1

您必须使用返回码。其他的选择会涉及可变的全局状态(思考C的错误)或传入可变对象(如列表),但你几乎总是希望避免在Python中。也许你可以试着向他们解释exceptions let you write better post-conditions而不是增加复杂性返回值,但是在其他方面是等价的。

相关问题