c++异常捕获的通俗理解

来源:互联网 发布:非线性回归分析python 编辑:程序博客网 时间:2024/06/05 02:34

异常,凡是写程序的基本都清楚,就像错误,时常会出现。

那么程序中异常处理非常重要,关于怎么捕获给个例子

    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 )就可以捕获到

 


	
				
		
原创粉丝点击