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 )就可以捕获到
- c++异常捕获的通俗理解
- C#_WinForm 统一捕获未处理的异常
- OBject-C捕获异常,常用的异常处理方法
- MMU的通俗理解
- 管程的通俗理解
- 傅里叶变换的通俗理解
- 计算机网络的通俗理解
- adaboost的通俗理解
- 通俗的理解Gradle
- handler的通俗理解
- 卷积的通俗理解
- 通俗的理解傅里叶变换
- docker的通俗理解
- MMU的通俗理解
- 熵的通俗理解
- 外汇管制的通俗理解
- 捕获异常消息Ctrl+C
- C++assert和捕获异常
- android 基础 Handler
- (转载)左倾堆 (leftist heap):方法参见 Data Structures (Weiss)
- java书籍2
- JDK环境变量配置
- FLEX 本地文件写入
- c++异常捕获的通俗理解
- POJ 3372 Candy Distribution
- Python 2.7 解决 “the error is 'ascii' codec can't encode”
- 随机数据产生的问题
- 地图渲染之Clusterer聚集
- 第三章 表空间、数据文件和控制文件
- 系统临时文件批量删除方法
- 如何通过junit测试EJB(Jboss容器)
- Android使用AttributeSet自定义控件的方法