C++异常处理(一)
来源:互联网 发布:js 列表添加元素 编辑:程序博客网 时间:2024/06/08 01:11
在程序的一般设计中,怎么判定一个方法适合按你预想的那样执行了,在C语言中,返回一个整数是常用的方法,比如一个-1,比如linux打开一个文件open,失败返回-1,大家如果都遵守还好,可是还是会出现返回0是失败的。Java中对于异常错误处理使用异常,异常是强制使用的,在C++中不是,你可以完全不使用,说实话我很好使用,有时基本都忘了,使用的最多的还是C的风格,这两个对于异常处理的风格没有孰优孰劣。C的风格简单,明了。C++的异常,可以包含更多的信息,方便日志,调试。
标准库中定义了异常类,可是那只框架层次的,在实际使用中,如果确定使用异常处理来进行异常错误处理,那么还需要在标准库之上拓展,或者自己再造轮子。
今天我不会讲在C++中使用异常的语法,只是讲一些注意点。
1.在构造函数中抛出异常
在构造函数中抛出异常,那说明什么,对象构造没成功,那么你精心设计的析构函数就可能没法调用,在构造函数中如果在抛出之前你什么的占用了一些资源,那必须你自己手动的释放。
比如这样:
A::A(){ p = new int[10]; //上面的内存分配完成,然后你抛出一个异常}A::~A(){ delete[] p;}
2.不能让析构函数抛出异常,有问题内部解决
析构函数是资源管理的不可多得的还途径,不管什么情况,请保证它执行完。
在基层体系中,你可能回担心在子类的析构函数中抛出异常,那父类的析构函数还会调用吗?我们先来看看类构造的顺序,我们只谈构造时生成的,static关键字就不谈了。
下面代码示例:
#ifndef SUPER_HPP#define SUPER_HPP#include <iostream>/** * @brief The Super class 超类 父类 */class Super{public: Super() {std::cout << "Super\n";} virtual ~Super() {std::cout << "Super 析构\n";}};#endif // SUPER_HPP#ifndef SUB_HPP#define SUB_HPP#include "super.hpp"class A{public: A() {std::cout << "A\n";} virtual ~A(){std::cout << "A 析构\n";}};/** * @brief The Sub class 子类 */class Sub : public Super{public: Sub():Super() {std::cout << "Sub\n";} virtual ~Sub(){throw 1;std::cout << "Sub 析构\n";}protected:private: A a;};#endif // SUB_HPP
#include "sub.hpp"int main(){ Sub *s = new Sub(); try { delete s; }catch(int i) { std::cout << i << std::endl; }}
如结果所示,父类先构造,然后是数据成员然后调用构造函数。C++会保证完全构造的对象是调用它的析构函数,所以前面的在有层次结构的类中的构造函数中抛出异常也是如此。不过抛出异常的析构函数不会调用完成,如上图少输出一句话,如果后续还有资源释放操作,那就会造成泄漏。
- C#中的异常处理(一)
- C#中的异常处理(一)
- C#中的异常处理(简单)一
- c语言实现异常处理 一
- C&&C++的异常处理(一)
- C++中的异常处理(一)——C和C++中异常处理的区别
- C#异常处理一
- AOP异常处理一
- Java异常处理 一
- java 异常处理(一)
- C++异常处理(一)
- 异常处理(一)
- C++ 异常处理(一)
- Java异常处理一
- (一)异常处理
- 异常处理(一)
- c#中的异常处理
- 异常处理 - [C++]
- hibernate中映射list
- 如何仅通过CSS实现多行文本超长自动省略号
- pat 1055 The World's Richest
- 求助!!!Simple_window.h在线等 ,用的code ::blocks
- Mantis时间显示错误(跟系统时间差8个小时)--解决办法
- C++异常处理(一)
- 【迟早得学】CSS3特效之文字阴影:text
- ADB不能正常使用
- POJ 2676—Sudoku
- 男人就要一直战斗
- 【原创】WP7中使用进度条——弥补几乎所有网络上与之相关的技术博文的内容缺陷
- 链队基本操作及打印杨辉三角
- http://acm.hdu.edu.cn/showproblem.php?pid=1527..
- day6 test04