搞了几年的编程,一直都在使用try...catch语句,却从来没想到,原来这些语句都是白用了。
最近做了一个项目,需要根据try...catch是否捕获到异常来作出选择,执行不同的操作。在Debug下执行一切正常,有异常的时候也能够捕获到,从而选择正确的路径执行,但是编译成Release版后有异常时始终不能捕获到,致使执行出错,找了好久也没找出是什么原因。
后来上网搜索才发现,原来问题出在微软的VC编译器的优化上:在Debug下代码未进行优化,所以没有问题,异常会被捕获。但在Release方式下如果选择default,不进行代码优化,则不会出错,但是代码的速度,效率和尺寸都比较差了,如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码, 如果没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉。 这样造成在Release模式下,try语句中的异常不能被捕获,从而迫使程序弹出错误提示框退出。
这个优化功能太整人了,本来写了这个语句就是感觉可能会出现异常,需要捕获异常的,结果发布时却给你优化掉了,导致错误,让人花费多少时间来查找错误的原因。
要解决这个问题,只要在C++编译命令行中加入 /EHa 的参数,这样VC编译器就不会把try...catch模块给优化掉了。