Questions tagged «assert»

断言是一条语句,当它的评估结果为false时,它将中止程序。断言通常用于调试和永远不会发生的情况。

17
断言何时应保留在生产代码中?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4个月前关闭。 改善这个问题 在comp.lang.c ++。moderated上正在进行一场讨论,讨论是否应将断言(应在C ++中默认情况下仅存在于调试版本中)保留在生产代码中。 显然,每个项目都是独特的,所以在这里我的问题是没有这么多是否断言应该保持,但在这情况下,这是值得推荐的/不是一个好主意。 断言是指: 一种运行时检查,用于测试条件,该条件为false时,表明软件中存在错误。 暂停程序的一种机制(可能是在清理工作最少之后)。 我不一定要谈论C或C ++。 我个人的意见是,如果您是程序员,但不拥有数据(大多数商业桌面应用程序就是这种情况),则应保留它们,因为断言失败会显示错误,并且您不应该去带有错误,可能会损坏用户的数据。这迫使您在发货之前进行严格的测试,并使错误更明显,从而更容易发现和修复。 您的看法/经验是什么? 干杯, 卡尔 在这里查看相关问题 回应和更新 嘿,格雷厄姆, 断言是错误,纯净而简单的断言,因此应像对待一个断言一样处理。由于应该在发布模式下处理错误,因此您实际上不需要断言。 这就是为什么我在谈论断言时更喜欢“ bug”一词的原因。它使事情变得更加清晰。对我来说,“错误”一词太含糊。丢失的文件是一个错误,而不是错误,程序应该对其进行处理。尝试取消引用空指针是一个错误,程序应该承认有些东西闻起来像不好的奶酪。 因此,您应该使用断言测试指针,但是使用正常的错误处理代码来测试文件的存在。 稍微偏离主题,但在讨论中很重要。 提醒您,如果断言失败时您的断言进入调试器,为什么不这样做。但是有很多原因导致文件不存在,这完全超出了代码的控制范围:读/写权限,磁盘已满,USB设备已拔出等。由于您无法控制它,因此我认为是断言不是正确的处理方式。 卡尔 托马斯 是的,我有完整的代码,必须说我完全不同意该特定建议。 假设您的自定义内存分配器已拧紧,并将仍由其他对象使用的内存块清零。我碰巧将这个对象定期取消引用的指针归零,其中一个不变之处是该指针永远不会为null,并且您有几个断言来确保它保持这种状态。如果指针突然为空,该怎么办。您只是围绕它if(),希望它能正常工作? 记住,我们在这里谈论产品代码,因此不会破坏调试器并检查本地状态。这是用户计算机上的真实错误。 卡尔
166 assert 





7
在assert中添加自定义消息?
有没有一种方法可以添加或编辑assert引发的消息?我想使用类似 assert(a == b, "A must be equal to B"); 然后,编译器添加line,time等等。 可能吗?
129 c++  assert 

14
使用断言或异常按合同进行设计?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 通过合同进行编程时,功能或方法首先要检查其先决条件是否已满足,然后再开始执行其职责,对吗?两个最重要的方式做这些检查是通过assert和exception。 assert仅在调试模式下失败。为了确保对所有单独的合同前提条件(单元)进行测试(以查看它们是否确实失败)至关重要。 异常在调试和发布模式下失败。这样的好处是,测试的调试行为与发布行为相同,但是会导致运行时性能下降。 您认为哪一个更可取? 在这里查看相关问题


5
带有和不带括号的python断言
这是assert的四个简单调用: >>> assert 1==2 Traceback (most recent call last): File "<stdin>", line 1, in ? AssertionError >>> assert 1==2, "hi" Traceback (most recent call last): File "<stdin>", line 1, in ? AssertionError: hi >>> assert(1==2) Traceback (most recent call last): File "<stdin>", line 1, in ? AssertionError >>> assert(1==2, "hi") …


5
在C ++中使用assert()是不好的做法吗?
我倾向于在我的C ++代码中添加很多断言,以使调试更加容易,而又不影响发行版的性能。现在,assert是一个纯C语言宏,它没有考虑C ++机制。 另一方面std::logic_error,C ++定义了,它是在程序逻辑中有错误(因此而得名)的情况下抛出的。抛出一个实例可能是的完美,更C ++的替代方法assert。 问题是,assert与abort两者立即终止程序,而无需调用析构函数,因此跳过清理,而抛出异常手动增加了不必要的运行时成本。解决该问题的一种方法是创建一个自己的断言宏SAFE_ASSERT,该宏的工作原理与C语言的对等宏相同,但会在失败时引发异常。 对于这个问题,我可以想到三点意见: 坚持C的主张。由于该程序会立即终止,因此是否正确展开更改并不重要。同样,#define在C ++中使用s同样不好。 引发异常并将其捕获到main()中。允许代码在程序的任何状态下跳过析构函数都是一种不好的做法,必须不惜一切代价避免这样做,对终止()的调用也应避免。如果引发异常,则必须将其捕获。 引发异常并使其终止程序。 终止程序的异常是可以的,并且由于NDEBUG,这在发行版本中永远不会发生。捕获是不必要的,并且可以向公开内部代码的实现细节main()。 这个问题有明确的答案吗?有专业参考吗? 编辑:跳过析构函数当然不是不确定的行为。



8
我应该在PHP代码中使用assert吗?
一位同事在我们的库中几次添加了assert命令,而这些地方本来可以使用if语句并引发异常。(在此之前,我什至从未听说过断言。)这是他如何使用它的一个示例: assert('isset($this->records); /* Records must be set before this is called. */'); 我会做的: if (!isset($this->records)) { throw new Exception('Records must be set before this is called'); } 通过阅读assert上的PHP文档,似乎建议您确保assert处于活动状态并在使用assert之前添加一个处理程序。我找不到他这样做的地方。 因此,我的问题是,鉴于上述情况,使用assert是否是一个好主意,我应该更频繁地使用它,而不是if和except吗? 另一个需要注意的是,我们计划在各种项目和服务器上使用这些库,包括我们甚至可能都不参与的项目(这些库是开源的)。这对使用assert有什么区别吗?
87 php  assert 

3
Django TestCase的断言方法列表在哪里?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案能得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我用谷歌搜索找到断言方法列表。但是似乎该文档已被很好地隐藏了。有人知道它在哪里吗?
87 django  testing  assert 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.