C++ 标准库中的异常
1. 相关定义
标准库 c++ 异常类基类 std::exception 定义在文件 exception 中。
class exception
{
public:
exception() throw() { }
virtual ~exception() throw();
/** Returns a C-style character string describing the general cause
* of the current error. */
virtual const char* what() const throw();
};
还有两个比较重要的子类是 std::logic_error,std::runtime_error,定义在文件 stdexcept中。
class logic_error : public exception
{
string _M_msg;
public:
/** Takes a character string describing the error. */
explicit logic_error(const string& __arg);
virtual ~logic_error() throw();
/** Returns a C-style character string describing the general cause of
* the current error (the same string passed to the ctor). */
virtual const char* what() const throw();
};
定义后面都附带了 throw(),表示可以抛出任何异常。由定义可以看出,异常子类已经
采用std::string来作为异常内容输入了。
2. 应用举例
//主程序文件
#include <iostream>
#include <exception>
#include <stdexcept>
using namespace std;
class CMyEXception :public std::logic_error
{
private:
const std::string m_msg;
const int m_errno;
public:
explicit CMyEXception(const std::string &__arg,int ierrno = 0):logic_error(__arg),m_msg(__arg),m_errno(ierrno)
{
//
}
virtual ~CMyEXception() throw()
{
stdf::cout<<"~CMyEXception()"<<endl;
}
virtual const char* what() const throw()
{
//如有必要,覆盖基类的定义
return m_msg.c_str();
}
int geterrno()
{
return m_errno;
}
};
int main()
{
try
{
throw CMyEXception(std::string("dddd"),10);
std::cout<<"after throw,not execute"<<endl;
}
catch(const CMyEXception &e)
{
std::cout<<"CMyEXception:"<<e.what()<<endl;
}
catch(const std::range_error &e)
{
std::cout<<"range_error:"<<e.what()<<endl;
}
catch(const std::runtime_error &e)
{
std::cout<<"runtime_error:"<<e.what()<<endl;
}
catch(const std::exception &e)
{
std::cout<<"exception:"<<e.what()<<endl;
}
catch(...)
{
std::cout<<"unexception ...:"<<endl;
}
}
程序从main开始执行,构造异常类,抛出异常CMyEXception。
异常抛出后,异常后面的输出不会被执行。异常捕获的层次是先按
最匹配的开始,也就是异常类自身,随后是其直接父类,一直上溯
到最上层的父类,这里,首先被 CMyEXception 捕获,输出。
如果没有设置CMyEXception来捕获,那接着就应该是std::runtime_error,
最后是std::exception。程序最后要回到构造异常类的执行点,析构异常类。
如果捕获异常没有采用按应用调用,还要考虑通过子类构造一个父类的拷贝构造过程。
最后,异常调用栈退栈完成,调用才结束。
C++ 标准库中的异常相关推荐
- 浅谈C++ 标准库中的异常 —— stdexcept类
<stdexcept>定义了一些标准的异常类.分为两大类:逻辑错误和运行时错误.其中运行时错误是程序员不能控制的. 目录: logic_error runtime_error throw ...
- iOS标准库中常用数据结构和算法之内存池
上一篇:iOS标准库中常用数据结构和算法之位串 ⛲️内存池 内存池提供了内存的复用和持久的存储功能.设想一个场景,当你分配了一块大内存并且填写了内容,但是你又不是经常去访问这块内存.这样的内存利用率将 ...
- C++标准库中各种排序归纳
一.简介 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.我们在编程过程中会经常接触到排序,比如游戏中的排行榜等.C++标准库中提供了各种不同的排序算法,这篇博 ...
- log包在Golang语言的标准库中是怎么使用的?
Golang 语言的标准库中提供了一个简单的 log 日志包,它不仅提供了很多函数,还定义了一个包含很多方法的类型 Logger.但是它也有缺点,比如不支持区分日志级别,不支持日志文件切割等. 01. ...
- C++标准库中的随机数生成
C++标准库中的随机数生成 一.伪随机与真随机 数字计算机的结果可以说是固定的.必然的.都是根据现有数据的状态得出接下来的状态.除非硬件损坏,计算机不会产生真正的随机和无法预料的事.在生活中随手抛一个 ...
- iOS标准库中常用数据结构和算法之二叉排序树
上一篇:iOS标准库中常用数据结构和算法之排序 ?二叉排序树 功能:二叉排序树的标准实现是一颗平衡二叉树.二叉排序树主要用来解决高效插入和高效检索以及进行排序的问题.系统分别提供了二叉排序树节点的查找 ...
- Git 源码禁止使用 C 标准库中容易被错用的函数
Git 项目的源码禁止开发者使用 C 标准库中的某些函数,原因是这些函数太容易被误用,就算使用得当也很容易出问题.因此 Git 的源码增加了一个 banned.h 的头函数,一旦你使用了这些被禁用的函 ...
- c/c++标准库中的文件操作总结
1 stdio.h是c标准库中的标准输入输出库 2 在c++中调用的方法 直接调用即可,但是最好在函数名前面加上::,以示区分类的内部函数和c标准库函数. 3 c标准输入输出库的使用 3.1 核心结构 ...
- php spl函数,PHP SPL标准库中的常用函数介绍
这篇文章主要介绍了PHP SPL标准库中的常用函数介绍,本文着重讲解了spl_autoload_extensions().spl_autoload_register().spl_autoload()三 ...
最新文章
- centos 网卡聚合及Cisco交换机链路聚合
- 小菜学设计模式——命令模式
- 【易网库】周年庆幸运大抽奖, 有机会获3年免费主机空间
- goland 方法注释_goland 设置注释模板的过程图文详解
- 堆排序算法java左程云_堆排序算法以及JAVA实现
- 2345浏览器网址_清理流氓网站2345.com劫持浏览器
- 冰点还原_8.60.020.5592_Standard版本手动卸载
- 【Codeforces】Chloe and the sequence (递归)
- 终于等到你:国内黑客团队360Vulcan公布iOS 12.1越狱漏洞细节
- 生活记录:突然“醒来”
- 简单批处理文件使用win7自带wifi,妈妈再也不担心WiFi软件不稳定了
- 文件查重删除,继续完善及修改上篇内容
- 金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-(一千零一拾一元整)输出
- 前端核武器:开源FrontendBlocks所见即所得低代码编辑器让所有人都能做前端布局
- vue 防抖节流,开箱即用
- SSLError: dh key to small(Python requests)
- android一键换机功能实现,不同品牌手机一键换机教程
- matlab随机抽取数字,Matlab 从多维正态分布中随机抽取样本:mvnrnd
- 目标检测(3)—— 如何使用PyTorch加载COCO类型的数据集
- 广州移动MGV2000_爱家TV_S905L3_安卓9.0_线刷固件包
热门文章
- 混合办公时代来了?携程试点每周两天居家办公,76%的员工主动报名!
- 皮一皮:碰到这样的领导怎么办...
- 资源过于敏澸,8h删!这波福利....请笑纳。。
- 合理利用延迟初始化优化 Spring Boot
- Java 中商业运算必备的精确运算类:BigDecimal
- mysql 5.7.28 windows_Windows下mysql-5.7.28下载、安装、配置教程
- 机械行业 偏计算机,院校篇丨机械类:985机械不如二本计算机?
- 台式计算机不能有线上网,台式电脑怎么样不能有线就可以连接网络,赶紧看看...
- pil numpy转换二值图
- ubuntu 安装gcc 4.8.2