在 comp.lang.c + + 上有一个 讨论。在 C + + 中默认只存在于调试构建中的断言是否应该保存在生产代码中。
显然,每个项目都是独一无二的,所以我的问题是 没有这么多的 是否断言应该保留,但在某些情况下这是值得推荐的/不是一个好主意。
我的意思是:
我说的不一定是 C 或 C + + 。
我个人的观点是,如果你是程序员,但不拥有数据(这是大多数商业桌面应用程序的情况) ,你应该保持它们,因为一个失败的断言显示一个错误,你不应该继续与一个错误,有损坏用户的数据的风险。这迫使您在发布之前进行强有力的测试,并使 bug 更加可见,从而更容易发现和修复。
你的意见/经验是什么?
干杯,
卡尔
见相关问题 给你
回应及更新
嘿,格雷厄姆,
断言是错误,纯粹而简单,因此应该像错误一样处理。 因为错误应该在发布模式下处理,所以您实际上不需要断言。
这就是为什么我在谈论断言时更喜欢用“ bug”这个词。这样事情就清楚多了。对我来说,“错误”这个词太含糊了。丢失的文件是一个错误,而不是 bug,程序应该处理它。尝试去引用一个空指针是一个错误,并且程序应该承认某些东西闻起来像坏奶酪。
因此,您应该使用断言测试指针,但使用正常的错误处理代码测试文件的存在。
有点跑题了,但这是讨论的重点。
提醒一下,如果您的断言在失败时闯入调试器,为什么不呢。但是文件不能存在的原因有很多,这些原因完全超出了代码的控制范围: 读/写权限、磁盘已满、 USB 设备已拔出等等。既然你不能控制它,我觉得断言不是处理这个问题的正确方式。
卡尔
托马斯,
是的,我有完整的代码,必须说,我强烈反对这个特别的建议。
假设您的自定义内存分配程序出了问题,并为某个其他对象仍在使用的内存块进行了归零。这个对象有规律地取消引用的指针刚好为零,其中一个不变量是这个指针永远不会为空,并且有几个断言可以确保它保持这种状态。如果指针突然为空,该怎么办。你只是如果()周围,希望它的工作?
记住,我们在这里讨论的是产品代码,因此不需要破解调试器并检查本地状态。这是用户机器上的一个真正的错误。
卡尔