能用if- else/throw-exception进行错误/异常处理的地方就不要用assert。

 
首先我们要明确assert的作用,它是在Debug版中断言某种状态或值,或者说在那一时刻,软件应该是某种状态,变量的值也是预期的。因此,从这个意义上说,应该使用assert的地方如果再加入if-else的错误处理就是画蛇添足、违反逻辑了。
或许有人会说:”assert只在Debug版本中有效,那Release版怎么办?”
l 用if-else。既然Release版有错误处理的需要,那么只用if-else就完全可以满足需要。
Ø 硬放一个assert在if-else前面,那么在错误出现的时候,系统会因为assertion failed而终止软件的运行,反而错失了错误的处理机会。而有的时候,错误处理也是很重要的过程,如果没有经过Debug版本的历练,很难保证将来Release版本的正确性。
Ø 硬放一个assert在if-else后面,既然错误已被处理,再assert就多此一举了。
l 抛异常。Release中抛异常,同Debug中的Assert失败效果类似,都会终止软件的运行。
 
使用assert和if-else的几种情况:
第一种情况,检查公有的、提供给外部使用的函数的传入参数。用if-else,不用assert。因为无论如何(Debug/Release)都要检查,所以assert没有必要。
 
第二种情况,检查私有、静态、匿名空间函数的传入参数,用assert,不用if-else。因为:
l 这些函数是内部函数,调用者应当很清楚哪些参数值是有效的,调用前应当已经做好准备。
l 这些函数是辅助函数,“根据参数,选择动作(if-else)”对于它们来讲是一种过于重大的任务,而应当由调用者负责完成。而且调用者做这个决策,也可以使其逻辑完备,易于阅读。
 
第三种情况,检查函数运行期间的状态,可用assert,也可以用if-else/throw-exception,根据需要而定。
l 如果确定此时的状态是某个值,其它情况是不可能的,用assert,
l 如果觉得不保险,可以抛出一个异常。
l 如果要根据不同的值做相应的处理,那么就用if-else。
 
总之,一句话,assert和if-else/throw-exception不可混用,而且优先使用后者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值