异常,凡是写程序的基本都清楚,就像错误,时常会出现。
那么程序中异常处理非常重要,关于怎么捕获给个例子
try
{
被检查语句
throw 异常
}
catch(异常类型1)
{
进行异常处理的语句1
}
catch(异常类型2)
{
进行异常处理的语句2
}
再举个例子
#include "stdafx.h"
#include <iostream>
template <typename T>
T Div(T x,T y)
{
if(y==0)
throw y;//抛出异常
return x/y;
}
int main()
{
int x=5,y=0;
doublex1=5.5,y1=0.0;
try
{
//被检查的语句
std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;
}
catch(int)//异常类型
{
std::cout<<"除数为0,计算错误!"<<std::endl;//异常处理语句
}
catch(double)//异常类型
{
std::cout<<"除数为0.0,计算错误!"<<std::endl;//异常处理语句
}
return0;
}
上面是捕获的是int double除法出错的例子,其他错误怎么办呢,现在就需要知道其他c++的异常类型,我现在已知的
包括int、double(分别的)、exception(所有的)n等等类型。
下面来超一段图表
异常类继承层级结构图如下:
每个类所在的头文件在图下方标识出来.
标准异常类的成员:
① 在上述继承体系中,每个类都有提供了构造函数、复制构造函数、和赋值操作符重载。
② logic_error类及其子类、runtime_error类及其子类,它们的构造函数是接受一个string类型的形式参数,用于异常信息的描述;
③ 所有的异常类都有一个what()方法,返回const char* 类型(C风格字符串)的值,描述异常信息。
标准异常类的具体描述:
异常名称 |
描述 |
exception |
所有标准异常类的父类 |
bad_alloc |
当operator new and operator new[],请求分配内存失败时 |
bad_exception |
这是个特殊的异常,如果函数的异常抛出列表里声明了bad_exception异常,当函数内部抛出了异常抛出列表中没有的异常,这是调用的unexpected函数中若抛出异常,不论什么类型,都会被替换为bad_exception类型 |
bad_typeid |
使用typeid操作符,操作一个NULL指针,而该指针是带有虚函数的类,这时抛出bad_typeid异常 |
bad_cast |
使用dynamic_cast转换引用失败的时候 |
ios_base::failure |
io操作过程出现错误 |
logic_error |
逻辑错误,可以在运行前检测的错误 |
runtime_error |
运行时错误,仅在运行时才可以检测的错误 |
logic_error的子类:
异常名称 |
描述 |
length_error |
试图生成一个超出该类型最大长度的对象时,例如vector的resize操作 |
domain_error |
参数的值域错误,主要用在数学函数中。例如使用一个负值调用只能操作非负数的函数 |
out_of_range |
超出有效范围 |
invalid_argument |
参数不合适。在标准库中,当利用string对象构造bitset时,而string中的字符不是’0’或’1’的时候,抛出该异常 |
runtime_error的子类:
异常名称 |
描述 |
range_error |
计算结果超出了有意义的值域范围 |
overflow_error |
算术计算上溢 |
underflow_error |
算术计算下溢 |
这就是所有的类型,当某种是你需要的类型时候直接填入到catch后面就可以达到要求了
说完这些个,mfc里面怎么弄呢,显然封装之后就不是这些数据类型了
MFC较好地将异常封装到CException类及其派生类中,自成体系,下表给出了MFC提供的预定义异常:
异常类 |
含义 |
CMemoryException |
内存不足 |
CFileException |
文件异常 |
CArchiveException |
存档/序列化异常 |
CNotSupportedException |
响应对不支持服务的请求 |
CResourceException |
Windows 资源分配异常 |
CDaoException |
数据库异常(DAO类) |
CDBException |
数据库异常(ODBC类) |
COleException |
OLE 异常 |
COleDispatchException |
调度(自动化)异常 |
CUserException |
用消息框警告用户然后引发一般 CException的异常 |
标准C++的异常处理可以处理任意类型的异常,而3.1节的MFC宏则只能处理CException的派生类型,下面我们看一个CFileException的使用例子:
#include<iostream.h>
#include"afxwin.h"
int main()
{
TRY
{
CFile f("d:\\1.txt", CFile::modeWrite );
}
CATCH(CFileException, e )
{
if( e->m_cause ==CFileException::fileNotFound )
cout <<"ERROR: File not found\n" << endl;
}
END_CATCH
}
在这个程序中,如果D盘根目录下不存在"1.TXT"这个文件,将抛出CFileException异常,而且错误原因成员变量m_cause被设置为fileNotFound,我们以CATCH(CFileException, e )就可以捕获到