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

时间: 2024-07-28 13:56:44

try catch语句在VC下的处理的相关文章

try~Catch语句中异常的处理过程

[2014/10/12 21:40]文章待续~ 1.函数自身捕获处理异常的情况 下面的例子介绍了try~catch语句中出现异常时语句的执行顺序: package month10; import java.lang.*; public class TryCatch{ /* * 函数产生一个ArithmeticException异常 */ public static void First(){ System.out.println("第一个异常处理的例子"); try{ //double

Java知多少(47)多重catch语句的使用

某些情况,由单个代码段可能引起多个异常.处理这种情况,你可以定义两个或更多的catch子句,每个子句捕获一种类型的异常.当异常被引发时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行.当一个catch语句执行以后,其他的子句被旁路,执行从try/catch块以后的代码开始继续.下面的例子设计了两种不同的异常类型: 1 // Demonstrate multiple catch statements. 2 class MultiCatch { 3 public static void

try...catch 语句

一般情况下,我们很少用到 try...catch 语句,但是有时候为了测试代码中的错误,也有可能会用到.小白我也在工作中用到过.那么好的程序设计,什么时候会用到呢? try...catch 一般用来捕获宿主对象或者ECMAScript抛出的异常. 1 try{ 2 // 此处运次代码 3 } catch(err) { 4 // 此处处理代码 5 } [注意]该语句严格区分大小写,使用大写字母会出错. 并且,try...catch...finally 为JS 实现错误处理: try { trySt

Java 多重catch语句的具体使用介绍

某些情况,由单个代码段可能引起多个异常.处理这种情况,你可以定义两个或更多的catch子句,每个子句捕获一种类型的异常.当异常被引发时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行.当一个catch语句执行以后,其他的子句被旁路,执行从try/catch块以后的代码开始继续.下面的例子设计了两种不同的异常类型:// Demonstrate multiple catch statements.class MultiCatch {    public static void main

Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制

Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制 1. 语法错误(ERROR)和运行期错误(Exception) 1 2. 错误类型判断 二种方法: 1 3. 我们常接触到的异常包括: 2 4. ------代码 2 5. 参考 4 1. 语法错误(ERROR)和运行期错误(Exception) Javascript提供了两种特殊的错误处理方式 BOM包含一个onerror事件处理函数,这个window对象与图像对象上都有 同时EC

javascript try...catch语句

try...catch语句将能引发错误的代码放在try块中,并且对应一个相应,然后有异常被抛出. 语法 try { try_statements } [catch (exception_var_1 if condition_1) { // non-standard catch_statements_1 }] ... [catch (exception_var_2) { catch_statements_2 }] [finally { finally_statements }] try_state

VC++下封装ADO类以及使用方法

操作系统:windows 7软件环境:visual studio 2008 .Microsoft SQL 2005本次目的:介绍一个已经封装的ADO类,简单说明怎么导入使用 首先声明一下,这个封装的ADO类是在[vc知识库 ]下载的,因为最近在数据库课程设计,所以对vc++下使用ADO连接数据库不是很了解,故若是本文有错误的地方的,请不吝指出.具体的ADO类各个封装功能请进入[原文地址 ]查看.在此仅介绍使用此ADO封装类的入门,如连接数据库,显示记录等.一个测试例子如下: 使用步骤:1.先从[

VC++下编译 程序“减肥”

在vc6 和 vs 2008下 编译 以下代码,不更改任何编译设置(vc6  40k , s2008 7k). 一.vc6下,Release 模式 编译处理. 1.去掉不必要的 链接库  工程(Project)-->设置(Settings)-->链接(link)属性页-->对象库/模块(object/library modules) 去掉所有的lib. 选择使用 MSVCRT.LIB kernel32.lib user32.lib. 可以忽略不必要的警告,比如 LINK:warning

VC下调试内存泄漏的办法

VC的控制台程序不会跟踪内存泄漏,如果需要调试控制台程序的内存情况,需要_CrtSetDbgFlag 详细原理我也不太懂,我也是从网上摘过来的,直接帖代码 // 内存泄漏跟踪 #ifdef WIN32 #include <SDKDDKVer.h> #ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #define VC_MemLeakCheck() _CrtSet