zoukankan      html  css  js  c++  java
  • try catch语句在VC下的处理

    使用VC编译QT程序碰到一个问题:

    我在.h文件里定义:
        LoadingWidget* w;
    然后.cpp文件里定义:

    void MyClass::ModifyTask()
    {
        // w = new LoadingWidget(); // 忘了生成实例
        try {
            w->show();    
        } catch (int e) {
            QMessageBox::warning(this, ("error"), ("Please input server address!"));
        }
    }
    尽管写上了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模块给优化掉了。

    ----------------------------------------------------------------------

    总结:尽管这篇文章解释的比较清楚,不过我还是觉得相当的友邦惊诧。因为delphi里就可以捕捉任何错误,java好像也是这样。写throw相当于程序员已经预料到了会出现什么错误,还不如写正常的代码来个else判断就行了。这样的try catch实在是意义不大。不过微软是老牌帝国,它对try catch这样理解,肯定还有更深层次的原因。

    参考:http://blog.csdn.net/yu444/article/details/5612714

  • 相关阅读:
    Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    用户画像——“打标签”
    python replace函数替换无效问题
    python向mysql插入数据一直报TypeError: must be real number,not str
    《亿级用户下的新浪微博平台架构》读后感
    【2-10】标准 2 维表问题
    【2-8】集合划分问题(给定要分成几个集合)
    【2-7】集合划分问题
    【2-6】排列的字典序问题
    【2-5】有重复元素的排列问题
  • 原文地址:https://www.cnblogs.com/findumars/p/4121754.html
Copyright © 2011-2022 走看看