C,C++,MFC 异常处理(zz)

以前开发c,c++,mfc程序的时候,错误处理这部分一直比较混乱。因为历史上的原因,用c,c++,mfc开发windows程序时,很多api处理错误的方式是通过返回一个值,然后规定返回值什么时候代表成功,什么时候代表失败。如果想要得到更加具体的结果信息,就要调用GetLastError来获得错误代码(也可能是正确代码,与之相应的可以调用SetLastError设置错误代码)。我个人认为这种错误处理方式的缺点就是没有一个统一的标准去判断一个api是成功还是失败,比如说同样是返回0,一个函数可能代表成功,一个函数反而代表失败,这样就非常容易造成混乱。C#和Java程序写多了,越来越羡慕两者优雅的异常处理机制,
      其实c,c++,mfc也有自己的异常处理机制,只不过在我印象中,这种异常处理机制远远不如通过判断函数返回值的方法来的流行。虽然异常处理机制不可避免的会带来性能上的损失,但是由于可以提供一种统一的错误处理接口,我更加喜欢这种方式。如果用c,c++,mfc开发大型的应用程序,采用统一的错误处理方式,不仅可以使代码的可维护性更强,而且可以使整个系统更加稳定。虽然C#,Java以其丰富的特性越来越被广泛采用,但是还是有很多领域内c,c++当仁不让得成为开发的首选,所以,熟悉一下它们的异常处理机制,还是很有好处的。
      昨天晚上(或者说今天早晨 )头脑发热,加上欧冠的原因没有熄灯,所以就趁机研究了一下c和c++中的异常处理机制,主要资料是《Windows核心编程》和msdn中关于c++ exception handle 中的内容。以前我一直以为c++的异常处理只是c的简单扩展,不过昨天晚上才发现自己大错特错。这完全是两套完全不同的机制。windows或者说c的异常处理机制称为结构化异常处理(seh,structured exception handling),是windows自身提供的功能,本身不是c语言自己实现的机制;而c++异常处理则完全是c++语言本身实现的机制。
      c中的结构化异常处理,主要分为两个部分,一个是结果清理,通过__try和__finally块实现,__try中包含可能产生异常的代码,而__finally中则是无论如何都会在__try中的代码产生异常或正常返回时执行的代码,因此可以在这里做一些清理工作;另一个部分是异常处理,通过__try和__except块实现,__try中的代码同上,而__except中的代码则是当异常捕获到后执行的代码。而至于怎样处理__try和__except中的代码,则要通过异常过滤器来决定,异常过滤器可以有三种值,来决定当产生异常的时候,是执行__except中的代码呢,还是再执行一遍__try中产生异常的语句,或者向外搜索外层的__try和__except块,让外层的块来处理这个异常。windows的结构化异常只能是unsigned int类型,程序可以根据异常的类型返回不同的过滤器类型,然后通过判断过滤器类型执行相应的操作。对于那些没有被捕获到的异常,系统会调用默认的处理程序进行处理,通常就是我们经常看到的异常对话框,一般后两个按钮,可以选择进行调试还是终止程序运行;严重的就是蓝屏!用户也可以定义自己的异常处理程序,来处理没有被捕获的异常。
      虽然__try,__except,__finally等关键字和C#中的很像,但是,机制却大不相同。__try后面要么跟一个__except块,要么跟一个__finally块,两个块可以嵌套却不能同时出现。还有局部展开,全部展开等等,开始的确把我搞的快崩溃了。
      而c++的异常处理,相对来说好理解点。主要有try,catch(...),catch(type),throw,throw(),throw(...),throw(type)等几个关键字和用法,令我百思不得其解的是为什么c++没有提供类似finally的关键字呢?需要注意的是,c++中可以throw出任何类型的异常,可以是一个int,也可以是一个class。比较有意思的是,throw(),throw(...),throw(type)用在一个函数的声明中,表示函数可能产生什么类型的异常。在Java中有类似的用法,现在才知道原来在c++中也有这种机制,呵呵。另外,除了可以产生强类型的异常之外,另一个c++异常的优点是throw可以自动析构在try块中,异常代码之前构造的对象。同样,当异常没有相应的catch进行捕获的时候,会有默认的处理函数进行处理,用户也可以定义自己的处理函数进行处理。
      MFC的异常处理机制,在c++的基础上实现(mfc的晚期版本),主要是提供一些宏。和c++异常处理主要的不同之处在于CATCH(CException e)处理完后,会进行e的清除工作,而c++中catch()则不会;另外一点不同就是mfc的宏只能处理CException及其派生的异常类。
      编写mfc程序的时候,可以混合使用这些不同的处理机制。但是,推荐使用的是c++的标准异常处理机制。
      由于c,c++中的垃圾处理完全开放给用户,所以,在应用程序出现异常的时候怎样保证所有的内存都被妥善回收和处理至关重要,而这要求对各种异常处理机制有深刻的了解,在程序中使用一种异常处理机制可以简化不同异常处理机制带来的垃圾处理复杂性(当然也减小了其他方面的复杂性)。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值