在工作中,我尝试了这种方法,这给我带来了麻烦。事实上,方法的名称,文档和实现并没有真正适合彼此(并且传递真实使条件成为真的变得虚假),我不明白这一点有这样的方法(这是生产代码):
# @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")
以下是我的担忧:
exists()
方法不是断言,并且总是返回一个布尔值!我没有看到让这种方法按原样投入生产的任何理由(并且应该实际删除,或者转移到单元测试套件中)。我非常有信心这种方法是错误的。但是,知道这个特定的代码是否合适是一回事,知道是否会以更一般的方式出现这种情况是另一回事。因此:
断言方法是否可以投入生产?
编辑:正如评论员指出的那样,它是一种相当常见的断言方法(就像python核心代码中那样)。然而,更深入的研究人员针对这种方法,我严格按照单元测试进行了测试。或"调试"有些人声称它不应该投入生产。如果它在测试/调试环境中,我就不会对这篇文章进行过修改。
因此:关于让断言方法在生产环境中滑倒的可行性的任何澄清?
编辑2:When should assertions stay in production code?这是我在Google搜索时创建的唯一一次会谈。我还不清楚。
答案 0 :(得分:3)
这种方法很好。
这"断言"函数并没有告诉我多少......并且会让客户认为它总会返回一个布尔值。
assert
是许多语言中常见的习语。目的是检查预期始终为真的条件。断言失败表示编码错误。因此,该方法通常不返回任何内容,并在条件失败时抛出异常。
"无"没有意义,没有提供给客户的信息,从来没有。客户端无法保存或传递该信息,或者必须写几行来简单地设置一个布尔变量;
无需检查断言的结果。
我认为当方法无法正常工作时,应该抛出异常,以应对意外行为。显然,它确实在这里!
断言应该100%通过。仅在条件意外失败时抛出异常。
这种方法限制了客户端处理他可能不关心的异常,并且在没有使用try..catch块的情况下也没有给出它自己的选择,这对我来说似乎不太好;
永远不应该处理断言异常。它们表示编码错误。没有期望程序应该从错误中恢复。通常最好只是崩溃。
我在错误和其他特殊情况之间做了区分。未找到文件等I / O错误是您需要规划的用户或系统错误。您应该捕获这些异常并从中恢复。空指针异常或断言错误是错误的迹象。你无法从他们身上恢复,因为当他们发生时谁知道其他可能出错的地方?错误需要修复,而不是处理。
然而,更深入的研究人员针对这种方法,我严格按照单元测试进行了测试。或"调试"有些人声称它不应该投入生产。如果它在测试/调试环境中,我就不会对这篇文章进行过修改。
在生产代码中运行断言没有错。它们没有害处,也没有糟糕的设计。事实上,他们的设计很好。他们确认系统运行正常。
人们有时会在生产代码中禁用断言的原因是性能。他们不想要额外支票的开销。就个人而言,我不会处理 性能敏感的任何程序,所以我始终保持启用断言。额外的安全性非常值得进行一些if
检查的成本可以忽略不计。