断言方法在生产中是否可以接受?

时间:2017-03-16 14:34:31

标签: python exception return

在工作中,我尝试了这种方法,这给我带来了麻烦。事实上,方法的名称,文档和实现并没有真正适合彼此(并且传递真实使条件成为真的变得虚假),我不明白这一点有这样的方法(这是生产代码):

# @brief An utility method that raises if the singleton is not in a good
# state
#@param expect_instanciated bool : if True we expect that the class is
# allready instanciated, else not
# @throw RuntimeError
@classmethod
def singleton_assert(cls, expect_instanciated=False):
    if expect_instanciated:
        if not cls.started():
            raise RuntimeError("The Settings class is not started yet")
    else:
        if cls.started():
            raise RuntimeError("The Settings class is already started")

以下是我的担忧:

  • 这"断言"函数并没有告诉我多少......并且会让客户认为它总会返回一个布尔值。
  • "无"没有意义,没有提供给客户的信息,从来没有。客户端无法保存或传递该信息,或者必须写几行来简单地设置一个布尔变量;
  • 我认为当方法无法正常工作时,应该抛出异常,以应对意外行为。显然,它确实在这里!
  • 此方法限制客户端处理他可能不关心的异常,并且在不使用try..catch块的情况下不给他自己的选择,这对我来说似乎不太好;
  • 这些提出的异常似乎假装是一个正常的返回值,就像一个" file_exists()"当它没有文件时,方法引发异常,当它没有文件时引发异常;
  • 对我来说,将这种方法留在生产中意味着我对代码的稳定性或设计没有信心。不应该有多个单例实例。例如,python的exists()方法不是断言,并且总是返回一个布尔值!我没有看到让这种方法按原样投入生产的任何理由(并且应该实际删除,或者转移到单元测试套件中)。

我非常有信心这种方法是错误的。但是,知道这个特定的代码是否合适是一回事,知道是否会以更一般的方式出现这种情况是另一回事。因此:

断言方法是否可以投入生产?

编辑:正如评论员指出的那样,它是一种相当常见的断言方法(就像python核心代码中那样)。

然而,更深入的研究人员针对这种方法,我严格按照单元测试进行了测试。或"调试"有些人声称它不应该投入生产。如果它在测试/调试环境中,我就不会对这篇文章进行过修改。

因此:关于让断言方法在生产环境中滑倒的可行性的任何澄清?

编辑2:When should assertions stay in production code?这是我在Google搜索时创建的唯一一次会谈。我还不清楚。

1 个答案:

答案 0 :(得分:3)

这种方法很好。

  

这"断言"函数并没有告诉我多少......并且会让客户认为它总会返回一个布尔值。

assert是许多语言中常见的习语。目的是检查预期始终为真的条件。断言失败表示编码错误。因此,该方法通常不返回任何内容,并在条件失败时抛出异常。

  

"无"没有意义,没有提供给客户的信息,从来没有。客户端无法保存或传递该信息,或者必须写几行来简单地设置一个布尔变量;

无需检查断言的结果。

  

我认为当方法无法正常工作时,应该抛出异常,以应对意外行为。显然,它确实在这里!

断言应该100%通过。仅在条件意外失败时抛出异常。

  

这种方法限制了客户端处理他可能不关心的异常,并且在没有使用try..catch块的情况下也没有给出它自己的选择,这对我来说似乎不太好;

永远不应该处理断言异常。它们表示编码错误。没有期望程序应该从错误中恢复。通常最好只是崩溃。

我在错误和其他特殊情况之间做了区分。未找到文件等I / O错误是您需要规划的用户或系统错误。您应该捕获这些异常并从中恢复。空指针异常或断言错误是错误的迹象。你无法从他们身上恢复,因为当他们发生时谁知道其他可能出错的地方?错误需要修复,而不是处理。

  

然而,更深入的研究人员针对这种方法,我严格按照单元测试进行了测试。或"调试"有些人声称它不应该投入生产。如果它在测试/调试环境中,我就不会对这篇文章进行过修改。

在生产代码中运行断言没有错。它们没有害处,也没有糟糕的设计。事实上,他们的设计很好。他们确认系统运行正常。

人们有时会在生产代码中禁用断言的原因是性能。他们不想要额外支票的开销。就个人而言,我不会处理 性能敏感的任何程序,所以我始终保持启用断言。额外的安全性非常值得进行一些if检查的成本可以忽略不计。