ChrisRockC / MyWiki

点-线-面
0 stars 0 forks source link

Assert #205

Open ChrisRockC opened 7 years ago

ChrisRockC commented 7 years ago

assert用在那些你知道绝对不会发生的事情上,但是因为人总是会犯错误,保不准你写出来的东西跟你想的不一样。所以assert用来捕捉的是程序员自己的错误。 同理,exception捕捉的是用户或者环境的错误。

ChrisRockC commented 7 years ago

assert处理的是 开发期 错误,在release代码上,assert是会移除的,所以,assert用来检查 程序员的错误。如果你的程序模块化做得好,用assert可以保证所有错误不出模块,遇到错误就被拦截。应用场景举例: 检查参数有效性 检查数组越界 switch/if控制流中的can't reach here放一个 不要free空指针 但是呢。。。也不是说每个数组都要检查越界,不是每个参数都要来一条assert。。。关键是要平衡,在重要代码处放上几个就可以了。那么,什么是重要代码?怎样是达到平衡?。。。如果你不明白这个,说明你需要更多练习。你可以从给所有自己写错的代码加上assert开始。。。。。

ChrisRockC commented 7 years ago

个人感觉断言是你在程序中添加的一种“契约”,表明这里这个值应该是什么,常见在防御式编程和契约式编程。 异常主要(不是runtime exp)是对程序无法避免的错误的错误处理。类似于error code。

在大型工程系统中(除了java),从软件工程的设计考虑,断言和异常都不常用。可以参见google golang的设计。上面说,在他们的实践中发现,使用异常让开发者很多时候生产出复杂的代码以及关心一些没有必要地异常。 而assert确实十分方便,但是再实践中通常会让开发者回避去思考一些十分重要的错误处理。