问题标签 [assert]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assert - 断言什么时候应该留在生产代码中?
在 comp.lang.c++.moderated 上有一个关于断言(在 C++ 中默认仅存在于调试版本中)是否应该保留在生产代码中的讨论。
显然,每个项目都是独一无二的,所以我的问题不是是否应该保留断言,而是在哪些情况下这是值得推荐的/不是一个好主意。
通过断言,我的意思是:
- 一种运行时检查,用于测试一个条件,当该条件为假时,会显示软件中的错误。
- 程序停止的一种机制(可能在非常少的清理工作之后)。
我不一定在谈论 C 或 C++。
我自己的观点是,如果你是程序员,但不拥有数据(大多数商业桌面应用程序就是这种情况),你应该继续使用它们,因为失败的断言表明存在错误,你不应该去有一个错误,有损坏用户数据的风险。这迫使您在发布之前进行严格的测试,并使错误更加明显,从而更容易发现和修复。
你的意见/经验是什么?
干杯,
卡尔
在此处查看相关问题
回应和更新
嘿,格雷厄姆,
断言是错误的,纯粹而简单,因此应该像对待一个断言一样处理。由于应在发布模式下处理错误,因此您实际上并不需要断言。
这就是为什么我在谈论断言时更喜欢“bug”这个词。它使事情变得更加清晰。对我来说,“错误”这个词太模糊了。丢失的文件是错误,而不是错误,程序应该处理它。试图取消引用空指针是一个错误,程序应该承认有些东西闻起来像坏奶酪。
因此,您应该使用断言测试指针,但使用正常的错误处理代码测试文件的存在。
稍微偏离主题,但在讨论中很重要。
提醒一下,如果您的断言在失败时闯入调试器,为什么不呢。但是文件无法存在的原因有很多,完全不受代码的控制:读/写权限、磁盘已满、USB 设备已拔出等。由于您无法控制它,我觉得断言是不是处理这个问题的正确方法。
卡尔
托马斯,
是的,我有 Code Complete,并且必须说我非常不同意那个特别的建议。
假设您的自定义内存分配器搞砸了,并将一块仍由其他对象使用的内存归零。我碰巧将这个对象定期取消引用的指针归零,其中一个不变量是这个指针永远不会为空,并且您有几个断言来确保它保持这种状态。如果指针突然为空怎么办。您只是 if() 围绕它,希望它有效吗?
请记住,我们在这里讨论的是产品代码,因此没有闯入调试器并检查本地状态。这是用户机器上的一个真正的错误。
卡尔
c++ - 如何在不使用 abort() 的情况下断言()?
如果我使用assert()
并且断言失败,那么assert()
将调用abort()
,突然结束正在运行的程序。在我的生产代码中我负担不起。有没有办法在运行时断言但能够捕获失败的断言,以便我有机会优雅地处理它们?
c# - Debug.Assert 与特定抛出的异常
我刚刚开始浏览 John Robbins 的“调试 MS .Net 2.0 应用程序”,并且对他对 Debug.Assert(...) 的宣传感到困惑。
他指出,良好实现的断言在某种程度上存储了错误条件的状态,例如:
现在,就我个人而言,他如此喜欢在没有实际明智的“业务逻辑”评论的情况下重述他的测试,这对我来说似乎很疯狂,也许“由于 florbittyjam widgitification 过程,i <= 3 绝不能发生”。
所以,我认为我将 Asserts 作为一种低级的“让我们保护我的假设”之类的东西......假设人们觉得这是一个只需要在调试中进行的测试 - 即你正在保护自己免受同事的伤害和未来的程序员,并希望他们能真正测试一些东西。
但我不明白的是,他接着说除了正常的错误处理之外,您还应该使用断言;现在我设想的是这样的:
错误条件测试的 Debug.Assert 重复我得到了什么?如果我们谈论一个非常重要的计算的仅调试双重检查,我想我会明白的......
...但我没有得到它用于肯定值得检查的参数测试(在调试和发布版本中)......或者不是。我错过了什么?
c++ - 当我的程序崩溃时如何自动生成堆栈跟踪
我正在使用 GCC 编译器在 Linux 上工作。当我的 C++ 程序崩溃时,我希望它自动生成堆栈跟踪。
我的程序由许多不同的用户运行,它也可以在 Linux、Windows 和 Macintosh 上运行(所有版本都使用 编译gcc
)。
我希望我的程序能够在崩溃时生成堆栈跟踪,并且下次用户运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题。我可以处理向我发送信息,但我不知道如何生成跟踪字符串。有任何想法吗?
visual-studio - 如何禁用程序断点/断言?
我正在使用 Visual Studio 开发本机应用程序,我在使用 __asm int 3 或 __debugbreak 放置的代码中有一个程序断点(断言)。有时当我点击它时,我想禁用它,以便同一调试会话中的连续点击不再闯入调试器。我怎样才能做到这一点?
exception - 使用断言或异常按合同设计?
当通过契约编程时,函数或方法首先检查其先决条件是否得到满足,然后再开始履行其职责,对吧?进行这些检查的两种最突出的方法是 byassert
和 by exception
。
- 断言仅在调试模式下失败。为了确保(单元)测试所有单独的合同先决条件以查看它们是否真的失败是至关重要的。
- 异常在调试和发布模式下失败。这样做的好处是测试的调试行为与发布行为相同,但会导致运行时性能损失。
你觉得哪一个更可取?
在此处查看相关问题
unit-testing - 没有断言的单元测试
偶尔我会遇到一个不断言任何东西的单元测试。我今天早上遇到的特定示例是测试在满足条件时写入日志文件。假设是,如果没有抛出错误,则测试通过。
我个人对此没有任何问题,但是编写一个没有任何相关断言的单元测试似乎有点“代码味道”。
只是想知道人们对此有何看法?
ruby - 将 assert() 方法添加到 Ruby 的 Kernel 类中是惯用的 Ruby 吗?
我正在通过在 Ruby 中编写与 Kent Beck 的 xUnit 等效的代码来扩展我对 Ruby 的理解。Python(由 Kent 编写)在广泛使用的语言中有一个 assert() 方法。红宝石没有。我认为添加它应该很容易,但是内核是放置它的正确位置吗?
顺便说一句,我知道 Ruby 中存在各种 Unit 框架——这是一个学习 Ruby 习语的练习,而不是“完成某事”。
java - 您如何断言在 JUnit 4 测试中引发了某个异常?
如何以惯用方式使用 JUnit4 来测试某些代码是否引发异常?
虽然我当然可以做这样的事情:
我记得有一个注释或一个 Assert.xyz 或其他东西,在这种情况下,JUnit 的精神远不那么笨拙,而且更符合 JUnit 的精神。