C++定义自己的异常
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;}
|
virtual const char* what() const; //c++11之后不再用了
virtual const char* what() const noexcept;
|
const 后面跟throw() 不是函数,这个东西叫异常规格说明,表示 what 函数可以抛出异常的类型,类型说明放到 () 里,这里面没有类型,就是声明这个函数不抛出异常,通常函数不写后面的就表示函数可以抛出任何类型的异常。 |
可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:void fun() throw(A,B,C,D);
|
//继承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++定义自己的异常的更多相关文章
- Android自己定义处理崩溃异常
用过安卓手机的用户以及安卓开发人员们会时长碰到程序异常退出的情况.普通用户遇到这样的情况,肯定非常恼火,甚至会骂一生垃圾软件,然后卸载掉.那么开发人员们在开发过程中遇到这样的情况给怎么办呢,当然,你不 ...
- Java多维数组定义以及常见异常
import java.lang.*; import java.util.*; public class Demo1 { public static void main(String args[]){ ...
- java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法
package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...
- VC++抛出自定义编译期异常的指令
#error 即可, 抛出消息是 #pragma message 最新的还有static_assert有一些用 一下子忘了网上居然搜不到...尝试了 关键字vc++.vc.vs.msvc + 抛出编 ...
- Web API--自定义异常结果的处理
1.常规的异常处理 统一的异常处理,把正确的信息返回给调用者很重要,可以让接口开发人员或者用户,了解具体的原因所在,这样可以得到有效的错误处理. 参考微信API的处理,微信API,对于调用都有一个错误 ...
- python的异常处理及异常类定义
python的异常处理语法和大多数语言相似: try: try块的语句... except exceptiontype1 as var:#使用as语句获得本次捕获到的异常的实例var except块语 ...
- 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception
异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
随机推荐
- Java定时器的三种实现方式
一.普通thread /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现, ...
- 雷林鹏分享:C# 字符串(String)
C# 字符串(String) 在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是使用 string 关键字来声明一个字符串变量.string 关键字是 System.String 类的 ...
- R基本图形示例及代码(持续收集)
分布图 hist(MetaData$genes, breaks = 100, main = "Gene number distribution", xlab = "Gen ...
- Lasso linear model实例 | Proliferation index | 评估单细胞的增殖指数
背景:We developed a cell-cycle scoring approach that uses expression data to compute an index for ever ...
- Java基础加强总结(一)——注解(Annotation)
一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts ...
- Cisco常用配置和命令
1.ASA常用管理management-access inside #开启远程连接inside口 show snmp-server oidlist #查看ASA snmp的 ...
- 2018JavaScript状态调查:5个重要的思考( import takeaways) (摘译)
英文原文 (内有视频). 以下是翻译和摘录. 最近JS状态调查结构出来了,如果你关心网页开发,你会关心这些结果. 本文探索5个takeaways并总结这些结论. 1. JavaScript Had ...
- 解决无法安装Microsoft .Net Framework 3.5
如果解决不了,试试我的方法吧,我也在网上找了好久,最终在本地解决了 所需工具:dism,和Net Framework 3.5,已经打包 链接:https://pan.baidu.com/s/1nKok ...
- 浅谈mysql
关于数据库其实我们可以简单的理解为存储货物的一个厂库,里面分别是按照一定的分类存放的物品,然后人们有时会从厂库中拿走或存储一些物品,有时也会更改或增加一些分类 这些物品都分门别类的存放在厂库中,方便人 ...
- Object.keys的使用
链接:https://www.nowcoder.com/questionTerminal/52c41b84e32a4158883cb112a1d1f850来源:牛客网 输出对象中值大于2的key的数组 ...