首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:不允许我引发异常。还有其他优雅的python方式吗?

Python:不允许我引发异常。还有其他优雅的python方式吗?
EN

Stack Overflow用户
提问于 2010-10-06 11:34:09
回答 3查看 382关注 0票数 1

我工作的地方有一条规则,禁止使用异常(允许捕获)。如果我有这样的代码

代码语言:javascript
复制
def f1()
 if bad_thing_happen():
   raise Exception('bad stuff')
 ...
 return something

我可以把它改成

代码语言:javascript
复制
def f1()
  if bad_thing_happen():
    return [-1, None]
  ...
  return [0, something]

f1调用者将如下所示

代码语言:javascript
复制
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中还有比这更优雅的方式吗?

EN

回答 3

Stack Overflow用户

发布于 2010-10-06 11:42:43

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

谁想出了这个包罗万象的政策,谁肯定在考虑另一种语言(也许是C++?)抛出异常是一种代价更高的操作(如果您的代码在一台有20年历史的计算机上执行,则会降低性能)。

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

票数 3
EN

Stack Overflow用户

发布于 2010-10-06 11:50:34

返回None是相当常见的,并且在概念上工作得很好。如果您期望一个返回值,但没有得到返回值,这是一个很好的指示,表明出现了错误。

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

当然,这些方法不会告诉您函数失败的原因。因此您可以返回一个异常实例,例如return ValueError("invalid index")。然后,您可以使用isinstance()测试特定的异常(或一般的异常),并打印它们以获得像样的错误消息。(或者,您可以提供一个助手函数来测试返回代码,以查看它是否派生自Exception。)您仍然可以创建自己的Exception子类;您只需返回它们,而不是引发它们。

最后,我将致力于改变这一荒谬的策略,因为异常是Python工作方式的重要组成部分,开销很低,任何使用您的函数的人都会期望异常。

票数 1
EN

Stack Overflow用户

发布于 2010-10-06 11:54:05

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3869326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档