body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

通过继承和重载exeception类定义新的异常
exeception类有一个虚函数
virtual const char* what() const;  //c++11之后不再用了
virtual const char* what() const noexcept;
const 后面跟throw() 不是函数,这个东西叫异常规格说明,表示 what 函数可以抛出异常的类型,类型说明放到 () 里,这里面没有类型,就是声明这个函数不抛出异常,通常函数不写后面的就表示函数可以抛出任何类型的异常。
异常规格说明:

1、异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些。
可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:void fun() throw(A,B,C,D);
2、若无异常接口声明,则此函数可以抛掷任何类型的异常。
3、不抛掷任何类型异常的函数声明如下:void fun() throw();

//继承exeception类实现自己的异常
#include<iostream>
#include<exception>
using namespace std;
class MyException:public exception
{
        public:
                const char* what()const throw()  
//函数后面必须跟throw(),括号里面不能有任务参数,表示不抛出任务异常
//因为这个已经是一个异常处理信息了,不能再抛异常。
                {
                        return "MyException";
                }
};
int main()
{
        try
        {
                throw MyException();
        }
        catch(MyException& e)    //传引用,防止调用拷贝构造函数
        {
                cout<<"this is MyException"<<endl;
                cout<<e.what()<<endl;
        }
}

//自己实现异常
#include<iostream>
#include<string>
using namespace std;
class exA
{
        public:
                exA(string strA):_strA(strA){ cout<<"exA()"<<endl; }
                ~exA(){ cout<<"~exA()"<<endl; }
                virtual const char* what()const throw()
                {
                        return _strA.c_str();
                }
        private:
                string _strA;
};
class exB : public exA
{
        public:
                exB(string strB):_strB(strB),exA("exA"){ cout<<"exB()"<<endl; }
                ~exB(){ cout<<"~exB()"<<endl; }
                const char* what()const throw()
                {
                        return _strB.c_str();
                }
        private:
                string _strB;
};
void fun(int n) throw(int,exA,exB)    //只能抛出int,exA,exB类型错误
{
        if(1==n){throw 1;}
        else if(2==n){throw exA("this is exA");}
        else if(3==n){ throw exB("this is exB");}
        else {throw 2.2;}
}
int main()
{
        try
        {
        //      fun(1);
        //      fun(2);
                fun(3);       //这里最终调动的是exA
                //因为在抛出异常对象的时候又建立了一个exA对象
                //要想执行异常exB,就要注释掉catch(exA& b)
                //不注释掉最后结果就是程序最后面一个
        //      fun(4);       //运行出现下列错误
                //terminate called after throwing an instance of 'double'
                //Aborted (core dumped)
        }
        catch(int a)
        {
                cout<<"throw int"<<endl;
        }
//      catch(exA& b)
//      {
//              cout<<b.what()<<endl;
//              cout<<"throw exA"<<endl;
//      }
        catch(exB& c)
        {
                cout<<c.what()<<endl;
                cout<<"throw exB"<<endl;
        }
        catch(...)
        {
                cout<<"oth exception"<<endl;
        }
        return 0;
}

//throw int
//exA()
//throw exA
//~exA()
//exA()
//this is exA
//throw exA
//~exA()
//exA()
//exB()
//this is exB
//throw exB
//~exB()
//~exA()
//exA()
//exB()
//this is exB
//throw exB
//~exB()
//~exA()
#include<iostream>
#include<exception>
using namespace std;
class myException:public exception
{
        public:
                myException(const char* str):_str(const_cast<char*>(str)) { }
                virtual ~myException()throw() { cout<<"~myException()"<<endl; }
                //析构函数不能抛出异常,不许加异常规格说明throw()
                const char* what()
                {
                        return _str;
                }
        private:
                char* _str;
};
int func(int a ,int b)throw(myException)  //函数可能抛出myException异常
{
        if(0==b)
        {
                throw *(new myException("除数不能为0"));    //两种都可以
        }
        return a/b;
}
int main()
{
        int a = 5,b = 0;
        int res;
        try
        {
                res = func(a,b);
        }
        catch(myException& e)
        {
                cout<<e.what()<<endl;
        //      delete &e;
        // 已经释放了,不用再释放了
        }
        cout<<res<<endl;
        return 0;
}

C++定义自己的异常的更多相关文章

  1. Android自己定义处理崩溃异常

    用过安卓手机的用户以及安卓开发人员们会时长碰到程序异常退出的情况.普通用户遇到这样的情况,肯定非常恼火,甚至会骂一生垃圾软件,然后卸载掉.那么开发人员们在开发过程中遇到这样的情况给怎么办呢,当然,你不 ...

  2. Java多维数组定义以及常见异常

    import java.lang.*; import java.util.*; public class Demo1 { public static void main(String args[]){ ...

  3. java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法

    package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...

  4. VC++抛出自定义编译期异常的指令

    #error 即可, 抛出消息是 #pragma message 最新的还有static_assert有一些用 一下子忘了网上居然搜不到...尝试了 关键字vc++.vc.vs.msvc +  抛出编 ...

  5. Web API--自定义异常结果的处理

    1.常规的异常处理 统一的异常处理,把正确的信息返回给调用者很重要,可以让接口开发人员或者用户,了解具体的原因所在,这样可以得到有效的错误处理. 参考微信API的处理,微信API,对于调用都有一个错误 ...

  6. python的异常处理及异常类定义

    python的异常处理语法和大多数语言相似: try: try块的语句... except exceptiontype1 as var:#使用as语句获得本次捕获到的异常的实例var except块语 ...

  7. 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception

    异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...

  8. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  9. [C#] C# 知识回顾 - 异常介绍

    异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...

随机推荐

  1. js正则表达式的积累

    验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证 ...

  2. 初探nginx负载均衡配置

    只简单说一下upstream的配置,如何进行负载均衡后续还需要多了解 1.另准备一个配置文件命名为nginx_test.conf 为了不污染原有的nginx.conf,提前复制一份配置文件做试验,然后 ...

  3. jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第一话):初次启动jenkins,输入给定密码后登录失败问题解决

    Jenkins是一个持续集成平台,它能够从git等源码管理服务器拉取代码.打包并发布到tomcat等中间件,只要配置好相关插件,就可以做到项目的自动化构建.部署,不论是对开发来说监控代码质量,还是对测 ...

  4. TP3.2.3框架与已有模板做结合

    具体实现步骤: a.  复制模板文件到View指定目录 b. 复制到css.img.js静态资源文件到系统指定目录 c. 把静态资源(css.img.js)文件的路径设置为"常量" ...

  5. caffe在solverstate的基础上继续训练模型

    以mnist数据集为例: bat训练脚本: Build\x64\Release\caffe.exe train --solver=examples/mnist/lenet_solver.prototx ...

  6. 自定义广播(BroadcastReceiver)事件 --Android开发

    本例演示自定义广播事件.我们需要做的是,在主活动中写发送广播的代码,然后在接收广播的类中写接收广播的代码. 1.主活动中点击按钮后发送广播 MainActivity.java: public clas ...

  7. BroadcastReceiver(广播)的静态注册和动态注册 --Android开发

    BroadcastReceiver是安卓四大组件之一,本例通过代码的方式演示静态注册和动态注册. 1.静态注册 静态注册只需要AndroidManifest.xml中进行配置: AndroidMani ...

  8. python记录_day27 tcp/ip五层模型

    ## 网络协议按照不同的功能分为多层,目前存在的模型有osi七层模型.tcp/ip五层和tcp/ip四层模型 我们主要用的是tcp/ip五层模型 那么每层的作用是什么呢,现在就从设计者的角度自下到上逐 ...

  9. 廖雪峰网站:学习python函数—定义函数(二)

    def my_abs(x): if x >= 0: return x else: return -x print(my_abs(-99)) # 空函数 def nop(): pass # 参数检 ...

  10. 【Oracle】【1】查询N分钟之前的数据

    --查询距离现在N分钟前的数据 1440:表示一天有1440分钟 SYSDATE - 10 :表示10天前 参考博客: 1,oracle 查询十分钟之前的数据 - 胡金水的博客 - CSDN博客 ht ...