虽然在发布模式下程序命中了一个断言,但是快乐地继续前进并崩溃.
为了解决这个问题,我已经将方法包装在try / catch块中,并在以前的断言处抛出错误.这应该记录我们跟踪的所有错误以及其他我们没有记录的错误.
现在我的问题是,我是否还应该使用断言通知程序员这不应该发生?或者现在它们会因为catch块(我清理对象)而不会崩溃?
或者我应该在catch块中而不是每个throw语句中抛出一个断言?
解决方法
try和catch用于处理预期的错误条件(用户提供了一个不存在的文件名,调用new无法分配内存,用户输入某种类型的无效输入等).
断言的目的是保证程序员不会犯错误.希望在发布时运行代码时,您已经涵盖了这些替代方案,并且知道代码“很好”.断言的典型示例是用户不应提供的某些指针,因为NULL确实不是NULL,或者链表具有预期的节点数[例如,你计算remove_node之前的节点数,并检查节点数确实少一个].
如果您不是100%确定(或者至少98.75%确定或您认为“足够好”的任何级别),那么您已经测试了所有代码,那么您不应该发布 – 或者如果您这样做,请获得您的质量保证经理签署“我们没有做足够的测试,但我们对此感到满意”.
try和catch应该只用于你的程序可以可靠地恢复的东西.不要抓住“程序员编写导致崩溃的愚蠢代码”.
编辑以澄清实际答案:
换句话说,是的,你应该使用assert来处理代码中你不希望发生的事情[至少如果程序员没有做错的话] – 这包括例如检查向量内部的向量例如,当你期望有一个方形矩阵或者指针不是NULL时,矩阵确实是一个正方形[除了你期望它们的位置 – 甚至可能在它们应该是时检查它们是否为空].
您还应该使用try / catch进行错误检查,并在出现问题时抛出,这可能在“现实生活”中运行实际程序期间发生 – 磁盘已满(或只读),文件不存在,内存不足,那种事情.