【问题标题】:Python: I'm not allowed to raise exception. Are there other elegant python ways?Python:我不允许引发异常。还有其他优雅的python方式吗?
【发布时间】:2011-04-21 14:59:30
【问题描述】:

我的工作场所规定了不使用异常的规则(允许捕获)。如果我有这样的代码

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 中还有比这更优雅的方法吗?

【问题讨论】:

  • 告诉你的工作单位我讨厌他们。就优雅的方式而言,那将是例外......你所做的很好(它很像 c 错误代码,只是更好),但我会返回一个元组而不是一个列表。这样就可以说成功了,result = f1(param)
  • 毫无例外地编写 C++ 代码是有道理的,但没有例外地编写 Python 代码是一派胡言。异常绝对是 Python 的基础。我强烈建议找到最近的塑料球棒,并尽可能多地用它打击你破坏性无能的老板。
  • 我和格伦一起做这个。不过,高尔夫球杆更好,同样的力量适用于较小的区域。
  • ...或 Dice.com/careers.stackoverflow.com/Moster 等...您的职业生涯刚刚发生了令人讨厌的转变。跳船。负责人显然是穴居人。
  • 你只有一个强制的限制,还是伴随着一些理智的理由?如果有原因,它们会很好地补充您的问题。 “为什么?”是一个非常明智的禅宗问题,会引发一种特定的心态。

标签: python exception raise


【解决方案1】:

python 中的异常是不可避免的,通常是解决问题的直接方法。此外,异常携带大量信息,可以帮助快速定位(通过堆栈跟踪)和识别问题(通过异常类或消息)。

提出这一全面政策的人肯定是在考虑另一种语言(可能是 C++?),其中抛出异常是一项更昂贵的操作(如果您的代码在 20 年的旧计算机上执行,则会降低性能)。

回答您的问题:另一种方法是返回错误代码。这意味着您将函数结果与错误处理混合在一起,这会引发(哈!)它自己的问题。但是,返回None 通常是指示功能失败的完全合理的方式。

【讨论】:

  • 当这种类型的策略被实施时,通常是由于一些幻影恐惧。一些“高级”开发者有时被某事咬伤,现在害怕它并强迫这种不合理的恐惧。
【解决方案2】:

返回None 相当普遍,并且在概念上运行良好。如果您期望返回值,但没有得到,这很好地表明出了问题。

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

当然,这些方法不会告诉您为什么函数失败了。所以你可以返回一个异常实例,例如return ValueError("invalid index")。然后,您可以使用isinstance() 测试特定异常(或一般的异常)并打印它们以获得体面的错误消息。 (或者您可以提供一个辅助函数来测试返回码以查看它是否派生自Exception。)您仍然可以创建自己的Exception 子类;您将只是将它们归还而不是提高它们。

最后,我会努力改变这个荒谬的政策,因为异常是 Python 工作方式的重要组成部分,开销低,并且任何使用你的函数的人都会期望。

【讨论】:

    【解决方案3】:

    您必须使用返回码。其他替代方案将涉及可变全局状态(想想 C 的 errno)或传入可变对象(例如列表),但您几乎总是希望在 Python 中避免这两种情况。或许您可以尝试向他们解释 exceptions let you write better post-conditions 的原理,而不是为返回值添加复杂性,但在其他方面是等效的。

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2010-11-12
      • 2015-04-10
      • 2010-09-21
      • 1970-01-01
      相关资源
      最近更新 更多