在微软c精粹中 作者提倡进行防御性编程的时候,要通知用户发生了什么事情。我的问题是一个程序什么时候应该使用断言只在调试版中使用,而什么时候应该进行防御性编程,什么时候应该抛出异常。
小弟学习不久,大家一起讨论 分不多,笑纳。

解决方案 »

  1.   

    断言是用来调试程序用的. 也就是如果正常工作的话,那么这里是不会出现这种结果的. 但在程序完全调试正常前, 谁也不敢保证.于是就用到断言了. 例如:一个函数有一个参数是一个指针. 因为函数内要操作这个指针,那么必需保证指针是不能为空的. 这里就可以加上断言:ASSERT(p!=NULL)
    当你的程序在调试过程中断言失败,说明你的代码哪里还有问题,,要找到问题,然后修正. 如果这些问题都解决了,那么断言将永远不会触发.所以在发行版中是不需要的. 异常是一种运行期也会出问题的地方, 如申请内存.虽然在林多数情况下申请内存都不会失败,但你不能保证永远不会失败. 那么为了防止一种万一没有申请到内存,后面的代码运行都不会正确了.这里就可以使用一个异常处理. 提示用户内存不足,然后退出,或者进行一些其它的补救措施.
      

  2.   

    MFC里面的ASSERT是不能用在Release工程设置里面的,MSDN推荐的是宏VERIFY,这个在Release里面可以使用的。另外,传说暴雪的游戏里面采用的就是这种风格。另外,可能EA的NFS系列也是这样(我玩的盗版在某个关卡必死,报错的对话框看起来像是用断言的)。估计你说的异常应该是C++里面的exceptions,这个东西进行了栈展开,如果真的要用这个的话,恐怕处理起来效率就有点那个了……但是某些东西不能不用异常,譬如dynamic_cast一个引用的时候,无法转换就会抛出异常。这个没办法避免,C++就这么设计的……
      

  3.   

    ooo 我有些明白了 断言应该用来测试写程序时你自己是否犯了错误,而如果运行期可能发生的问题,应该用异常来处理 是不是这个意思