zoukankan      html  css  js  c++  java
  • VC++ try catch

    try{} catch(…){}
    以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:
    try 

    BYTE* pch ; 
    pch = ( BYTE* )00001234 ;   //给予一个非法地址 
      
    *pch = 6 ; //对非法地址赋值,会造成Access Violation 异常 

    catch(...) 

    AfxMessageBox( "catched" ) ; 
    }


    这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。 但在Release方式下如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码, 如果没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉。 这样造成在Release模式下,上述代码中的异常不能被捕获,从而迫使程序弹出错误提示框退出。
    那么能否在release代码优化状态下捕获这个异常呢, 答案是有的。 就是__try, __except结构, 上述代码如果改成如下代码异常即可捕获。
    __try 

    BYTE* pch ; 
    pch = ( BYTE* )00001234 ;   //给予一个非法地址 
      
    *pch = 6 ; //对非法地址赋值,会造成Access Violation 异常 

    __except( EXCEPTION_EXECUTE_HANDLER ) 

    AfxMessageBox( "catched" ) ; 
    }


    但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。 而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712 的编译错误。 那么还有没有别的办法呢?
    当然有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。
  • 相关阅读:
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    210 Course ScheduleII
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    sql 开发经验
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318432.html
Copyright © 2011-2022 走看看