C++异常处理 http://blog.csdn.net/oury
来源:互联网 发布:数控编程用什么软件好 编辑:程序博客网 时间:2024/04/30 06:49
在讨论C++异常处理之前,先看看一个C语言编程中常见的例子:
#include <stdio.h>
FILE *fp;
Fp=fopen(“test.txt”,”r”);
If(fp==NULL)
{
printf(“Can’t Open File!/n”);
exit(0);
}
一个健壮的程序需要考虑很多会使程序失效的因素,如果对各种因素都进行如上的条件判断,那么整个程序的结构就会变得非常混乱。
C++处理错误的方法由不一样,它有如下特点:
1、 不需要打乱程序的结构,如果没有任何错误产生,那么程序的运行应该不受任何影响。
2、 不依靠函数的返回值来报告错误是否产生。
3、 即使采用集中的方式处理错误,也能够根据错误种类的不同来进行对应的错误处理操作。
下面来看看C++中提供的异常机制是如何做到这几点的。
///---------------------------------------------------------------------------
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
///---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
double *data;
try
{
data=new double[1000];
}
////std::bad_alloc是new操作符唯一可能发出的异常
catch(std::bad_alloc)
{
cout<<"can't alloc memory!"<<endl;
exit(0);
}
////捕获所有剩下的异常
catch(...)
{
}
delete []data;
ShowMessage("ok");
return 0;
}
///---------------------------------------------------------------------------
使用异常的语法很简单,对所有可能产生异常的语句包含在try块中,并在随后的catch语句中捕获发生的异常。一个try块后可以跟随几个不同的catch语句,用来捕获不同的异常。如果希望捕获任何可能发生的异常,应该使用catch(…)语句。如果希望在自己编写的程序中产生异常,可以按如下的方法:
///---------------------------------------------------------------------------
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
///---------------------------------------------------------------------------
#pragma argsused
class Out{};
int main(int argc, char* argv[])
{
try
{
throw Out(); ///抛出一个临时的Out对象
}
catch(Out& e) ///捕获Out异常
{
cout<<"Out Exception throwed!"<<endl;
throw; ///向外层抛出异常
}
return 0;
}
///---------------------------------------------------------------------------
利用关键字throw可以抛出任意的对象。这个对象不需要继承exception类。即使是基本类型数据,也可以作为throw的参数抛出。在catch的参数中如果包含一个类似变量声明的表达式,就可以在catch块中使用这个异常对象。如果在catch块中处理完一个异常后,异常造成的后果并不能完全消除,那么可以在catch语句中再次调用catch语句,从而使得捕获向外层传播。如果一个函数中没有处理发生的异常,那么异常将会传播到调用此函数的代码段中。
正文
- C++异常处理 http://blog.csdn.net/oury
- CFileException文件的异常处理 http://blog.csdn.net/holandstone/article/details/7602249
- http://blog.csdn.net/
- http://blog.csdn.net
- 异常处理 续之(堆栈解退、auto_ptr)http://blog.csdn.net/feitianxuxue/article/details/7314079
- 链表 C http://blog.csdn.net/pf4919501/article/details/38818335
- http://blog.csdn.net/matrix2003b/
- http://blog.csdn.net/matrix2003b/
- http://blog.csdn.net/sinapaper/
- http://blog.csdn.net/jjcwww
- http://blog.csdn.net/hkbarton/
- http://blog.csdn.net/cpluser/
- http://blog.csdn.net/chensheng913/
- http://blog.csdn.net/duoshanx
- http://blog.csdn.net/calvinxiu/
- http://blog.csdn.net/shardy
- http://blog.csdn.net/aoosang
- http://blog.csdn.net/hacker_zihan/
- D3D中的雾
- Linux网络编程读书笔记(6)
- RRAS穿越Firewall用NAT提供安全性上网
- [笔记] SWT的三个基本模块
- Linux网络编程读书笔记(7)
- C++异常处理 http://blog.csdn.net/oury
- Visual Basic图像处理基础讲座
- 数据库查询中的通配符
- Java 关于中文乱码问题的解决方案与经验 (1)
- 如何在自己的博客中加入时钟、天气、流量(更新修正)1月17日
- Java 关于中文乱码问题的解决方案与经验 (2)
- 在VB6中用命令行为模式控制GUI动作
- D3D中的第一人称视角
- Java深入探索之道Java类加载机制的奥秘