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中有比这更优雅的方法吗?     
已邀请:
python中的异常不是必须避免的,并且通常是解决问题的直接方法。此外,异常带有大量信息,可以帮助快速定位(通过堆栈跟踪)并识别问题(通过异常类或消息)。 提出这种一揽子政策的人肯定在考虑另一种语言(也许是C ++?),其中抛出异常是一种更昂贵的操作(如果您的代码在20岁的计算机上执行,将会降低性能)。 要回答您的问题:另一种方法是返回错误代码。这意味着您正在将函数结果与错误处理混合在一起,从而引发(ha!)它自身的问题。然而,返回
None
通常是指示功能失败的完美合理方式。     
返回
None
是相当普遍的,并且在概念上运作良好。如果你期望一个返回值,并且你没有得到,那么这是一个很好的迹象表明出了问题。 另一种可能的方法是,如果您希望返回列表(或字典等),则返回空列表或字典。这可以很容易地使用
if
进行测试,因为在Python中空容器的评估值为
False
,如果你要迭代它,你可能甚至不需要检查它(取决于你想要做什么,如果函数失败) )。 当然,这些方法并不能告诉您函数失败的原因。所以你可以返回一个异常实例,例如
return ValueError("invalid index")
。然后,您可以使用
isinstance()
测试特定异常(或一般的异常)并打印它们以获得不错的错误消息。 (或者你可以提供一个辅助函数来测试返回代码,看它是否来自
Exception
。)你仍然可以创建自己的
Exception
子类;你只是回来而不是提高他们。 最后,我会努力改变这个荒谬的政策,因为异常是Python工作方式的重要组成部分,开销很低,任何使用你的功能的人都会期望。     
您必须使用返回代码。其他替代方案将涉及可变的全局状态(想想C的错误)或传入可变对象(例如列表),但是你几乎总是希望在Python中避免这两者。也许您可以尝试向他们解释异常如何让您编写更好的后置条件,而不是将复杂性添加到返回值,但在其他方面是等效的。     

要回复问题请先登录注册