断言,防御性编程与异常 大家一起讨论 在微软c精粹中 作者提倡进行防御性编程的时候,要通知用户发生了什么事情。我的问题是一个程序什么时候应该使用断言只在调试版中使用,而什么时候应该进行防御性编程,什么时候应该抛出异常。小弟学习不久,大家一起讨论 分不多,笑纳。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 断言是用来调试程序用的. 也就是如果正常工作的话,那么这里是不会出现这种结果的. 但在程序完全调试正常前, 谁也不敢保证.于是就用到断言了. 例如:一个函数有一个参数是一个指针. 因为函数内要操作这个指针,那么必需保证指针是不能为空的. 这里就可以加上断言:ASSERT(p!=NULL)当你的程序在调试过程中断言失败,说明你的代码哪里还有问题,,要找到问题,然后修正. 如果这些问题都解决了,那么断言将永远不会触发.所以在发行版中是不需要的. 异常是一种运行期也会出问题的地方, 如申请内存.虽然在林多数情况下申请内存都不会失败,但你不能保证永远不会失败. 那么为了防止一种万一没有申请到内存,后面的代码运行都不会正确了.这里就可以使用一个异常处理. 提示用户内存不足,然后退出,或者进行一些其它的补救措施. MFC里面的ASSERT是不能用在Release工程设置里面的,MSDN推荐的是宏VERIFY,这个在Release里面可以使用的。另外,传说暴雪的游戏里面采用的就是这种风格。另外,可能EA的NFS系列也是这样(我玩的盗版在某个关卡必死,报错的对话框看起来像是用断言的)。估计你说的异常应该是C++里面的exceptions,这个东西进行了栈展开,如果真的要用这个的话,恐怕处理起来效率就有点那个了……但是某些东西不能不用异常,譬如dynamic_cast一个引用的时候,无法转换就会抛出异常。这个没办法避免,C++就这么设计的…… ooo 我有些明白了 断言应该用来测试写程序时你自己是否犯了错误,而如果运行期可能发生的问题,应该用异常来处理 是不是这个意思 为啥accept()函数不阻塞哪? VC ado 动态创建ACCESS 表,怎么做? 运行时出现R6034的问题 哪里有WIN32 API啊? 我的邮箱 [email protected] 给我邮一份 谢谢 小女子不胜感激 请问用_ConnectionPtr对象能执行存储过程吗? 如何表示2进制数? 关于弹出菜单问题,,,,,急用,,,waiting................. 如何改变文本的背景色? 怎样做可折叠的对话框? 电脑报上一个关于vc编程的问题! VC中怎样设置串口一次接收数据〉8个字节?谢谢 用SOCKET传输2组数据的问题
当你的程序在调试过程中断言失败,说明你的代码哪里还有问题,,要找到问题,然后修正. 如果这些问题都解决了,那么断言将永远不会触发.所以在发行版中是不需要的. 异常是一种运行期也会出问题的地方, 如申请内存.虽然在林多数情况下申请内存都不会失败,但你不能保证永远不会失败. 那么为了防止一种万一没有申请到内存,后面的代码运行都不会正确了.这里就可以使用一个异常处理. 提示用户内存不足,然后退出,或者进行一些其它的补救措施.