【问题标题】:How to return a fail value in python如何在python中返回失败值
【发布时间】:2016-07-21 19:53:02
【问题描述】:

如果函数失败,我希望找到一个从函数返回失败的良好约定。我通常喜欢返回 None 或 False,但在我的情况下,该函数的目的是读取一个 IO,它可以是 bool (True/False)、int 或 float。

所以在这种情况下,我不能返回 False。我尝试使用 None 但我不知道这是否是最好的情况,如果我在调用函数时不检查返回值,None 输出可能会被识别为 False 输出。

我在考虑有一个包含字符串标记的定义文件,但是必须解析字符串似乎很有效。

是否有可用的内置对象?约定是什么?

【问题讨论】:

  • 很确定约定是引发错误。
  • 您是否考虑过在错误时引发异常?
  • 使用例外。这就是他们的目的。我知道很多不熟悉它们的程序员觉得他们根本不希望发生“错误”,而仅仅捕获它并不是一个很好的解决方案,但这不是错误,而是一个例外- 这就是他们的目的。
  • 如果您想要的东西不只是在您忘记检查返回值时被隐藏,您几乎必须引发异常。

标签: python function exception exception-handling


【解决方案1】:

如果函数失败,您应该引发异常。根据 Python 的EAFP 原则,必须检查您的返回值是否无效,这不是一个好习惯。

请求宽恕比请求许可更容易。这种常见的 Python 编码风格假设存在有效的键或属性,如果假设被证明是错误的,则捕获异常。这种干净快速的风格的特点是存在许多 try 和 except 语句。该技术与许多其他语言(如 C)常见的 LBYL 风格形成鲜明对比。

【讨论】:

  • 如果我要在函数中引发异常,我是否还需要从函数中返回一些内容并从调用方处理它,以便我的脚本继续运行?或者我应该从调用方获得另一个尝试和异常声明?
  • 异常的想法是简单地将两个程序流分开:正常(如果一切正常)和异常(当某些东西被破坏时)。当程序语言中出现异常时,对于支持异常机制的语言,旧的“检查返回值”编程风格已被弃用(很少有异常)。当您的函数正常完成时,它会返回预期的结果值。如果不是 - 它会引发异常,调用者模块应该捕获并处理它 - 如果它知道如何处理此异常,则返回值将不会传递给调用者函数
  • @lospejos 为了让调用者模块“捕捉并处理它”,你会怎么做?你会使用 try 和 except 语句来处理它吗?
  • @Sam 就我个人而言,我正在指导下一个相对简单的规则:如果我可以从底层方法/函数中获取异常,那么我会在两种情况下捕获它:何时需要写入日志以及何时可以我会处理那个例外。否则(例如,我有异常,但我无能为力)我只是将其重新抛出以调用堆栈(只是在调用函数时不放置 try.. except 块)。此外,当我记录异常并且无法处理它(不知道该怎么做)时 - 我也将其重新抛出以调用堆栈。此外,永远不要隐藏异常(空的 catch 块),除非您完全确定自己在做什么。
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 2018-12-08
  • 1970-01-01
  • 2013-06-24
  • 2015-09-26
  • 1970-01-01
  • 2011-07-27
  • 2015-01-15
相关资源
最近更新 更多