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++ 标准库中的异常相关推荐

  1. 浅谈C++ 标准库中的异常 —— stdexcept类

    <stdexcept>定义了一些标准的异常类.分为两大类:逻辑错误和运行时错误.其中运行时错误是程序员不能控制的. 目录: logic_error runtime_error throw ...

  2. iOS标准库中常用数据结构和算法之内存池

    上一篇:iOS标准库中常用数据结构和算法之位串 ⛲️内存池 内存池提供了内存的复用和持久的存储功能.设想一个场景,当你分配了一块大内存并且填写了内容,但是你又不是经常去访问这块内存.这样的内存利用率将 ...

  3. C++标准库中各种排序归纳

    一.简介 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.我们在编程过程中会经常接触到排序,比如游戏中的排行榜等.C++标准库中提供了各种不同的排序算法,这篇博 ...

  4. log包在Golang语言的标准库中是怎么使用的?

    Golang 语言的标准库中提供了一个简单的 log 日志包,它不仅提供了很多函数,还定义了一个包含很多方法的类型 Logger.但是它也有缺点,比如不支持区分日志级别,不支持日志文件切割等. 01. ...

  5. C++标准库中的随机数生成

    C++标准库中的随机数生成 一.伪随机与真随机 数字计算机的结果可以说是固定的.必然的.都是根据现有数据的状态得出接下来的状态.除非硬件损坏,计算机不会产生真正的随机和无法预料的事.在生活中随手抛一个 ...

  6. iOS标准库中常用数据结构和算法之二叉排序树

    上一篇:iOS标准库中常用数据结构和算法之排序 ?二叉排序树 功能:二叉排序树的标准实现是一颗平衡二叉树.二叉排序树主要用来解决高效插入和高效检索以及进行排序的问题.系统分别提供了二叉排序树节点的查找 ...

  7. Git 源码禁止使用 C 标准库中容易被错用的函数

    Git 项目的源码禁止开发者使用 C 标准库中的某些函数,原因是这些函数太容易被误用,就算使用得当也很容易出问题.因此 Git 的源码增加了一个 banned.h 的头函数,一旦你使用了这些被禁用的函 ...

  8. c/c++标准库中的文件操作总结

    1 stdio.h是c标准库中的标准输入输出库 2 在c++中调用的方法 直接调用即可,但是最好在函数名前面加上::,以示区分类的内部函数和c标准库函数. 3 c标准输入输出库的使用 3.1 核心结构 ...

  9. php spl函数,PHP SPL标准库中的常用函数介绍

    这篇文章主要介绍了PHP SPL标准库中的常用函数介绍,本文着重讲解了spl_autoload_extensions().spl_autoload_register().spl_autoload()三 ...

最新文章

  1. centos 网卡聚合及Cisco交换机链路聚合
  2. 小菜学设计模式——命令模式
  3. 【易网库】周年庆幸运大抽奖, 有机会获3年免费主机空间
  4. goland 方法注释_goland 设置注释模板的过程图文详解
  5. 堆排序算法java左程云_堆排序算法以及JAVA实现
  6. 2345浏览器网址_清理流氓网站2345.com劫持浏览器
  7. 冰点还原_8.60.020.5592_Standard版本手动卸载
  8. 【Codeforces】Chloe and the sequence (递归)
  9. 终于等到你:国内黑客团队360Vulcan公布iOS 12.1越狱漏洞细节
  10. 生活记录:突然“醒来”
  11. 简单批处理文件使用win7自带wifi,妈妈再也不担心WiFi软件不稳定了
  12. 文件查重删除,继续完善及修改上篇内容
  13. 金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-(一千零一拾一元整)输出
  14. 前端核武器:开源FrontendBlocks所见即所得低代码编辑器让所有人都能做前端布局
  15. vue 防抖节流,开箱即用
  16. SSLError: dh key to small(Python requests)
  17. android一键换机功能实现,不同品牌手机一键换机教程
  18. matlab随机抽取数字,Matlab 从多维正态分布中随机抽取样本:mvnrnd
  19. 目标检测(3)—— 如何使用PyTorch加载COCO类型的数据集
  20. 广州移动MGV2000_爱家TV_S905L3_安卓9.0_线刷固件包

热门文章

  1. 混合办公时代来了?携程试点每周两天居家办公,76%的员工主动报名!
  2. 皮一皮:碰到这样的领导怎么办...
  3. 资源过于敏澸,8h删!这波福利....请笑纳。。
  4. 合理利用延迟初始化优化 Spring Boot
  5. Java 中商业运算必备的精确运算类:BigDecimal
  6. mysql 5.7.28 windows_Windows下mysql-5.7.28下载、安装、配置教程
  7. 机械行业 偏计算机,院校篇丨机械类:985机械不如二本计算机?
  8. 台式计算机不能有线上网,台式电脑怎么样不能有线就可以连接网络,赶紧看看...
  9. pil numpy转换二值图
  10. ubuntu 安装gcc 4.8.2