STL5-异常

异常可以跨函数

异常必须处理

1、

#include<iostream>
using namespace std;
//c++异常机制 跨函数
//c++异常必须处理 不能留,否则报错
int divided(int x, int y)
{if (y == 0)throw y;  //抛异常return (x / y);
}
void test01()
{int x = 10, y = 0;//试着去捕获异常try{divided(x, y);}catch (int y)  //异常是根据类型进行匹配{cout << "除数为" << y <<"!"<< endl;}
}void CallDivide(int x, int y)
{divided(x, y);
}
//如果异常抛到顶层,还没有处理这个时候程序后挂掉terminal()
//a调用b,b调用c,c调用d函数 a-->b-->c-->d
//d抛出异常,c没有处理,则继续给b,b还没有处理给a,则异常给a,a处理(catch)即可。若a还不处理,则报错,程序挂掉
void test02() {try{CallDivide(1, 0);}catch (int e){cout << "除数为" << e << endl;}
}
int main()
{test01();cout << "------------------" << endl;test02();
}

2、栈解旋

#include<iostream>
using namespace std;class person {
public:person(){cout << "对象构建" << endl;}~person(){cout << "对象析构" << endl;}};int divide(int x, int y)
{person p1, p2;if (y == 0)throw y;return x / y;
}
//栈解旋:try catch中调用函数发生异常时,函数内的局部变量会被析构掉
void test01()
{try {divide(10, 0);}catch (int e){cout << "异常捕获!" << endl;}
}int main()
{test01();return 0;
}

3、异常接口的声明

#include<iostream>
using namespace std;
//这个函数只能抛出int,float,char三种类型异常,抛出其他报错
void func() throw(int, float, char)
{throw "abc";
}
//不能抛出任何类型异常
void func02() throw()
{throw - 1;
}
//抛出任何类型异常
void func03()
{throw - 2;
}
int main()
{try {func();}catch (char* str){cout << str << endl;}catch (int e){cout << "异常!" << endl;}catch (...)  //...代表所有异常类型{cout << "捕获所有未知类型异常" << endl;}
}

 

4、异常类型

#include<iostream>
using namespace std;void func01(){throw 1;  //抛出int类型异常
}
void func02() {throw "exception";  //抛出char*类型异常
}
class MyException {
public:MyException(char* str) {error = new char[strlen(str) + 1];strcpy(error, str);}void what() {cout << error << endl;}MyException(const MyException& ex){    //拷贝构造this->error = new char[strlen(ex.error) + 1];strcpy(this->error, ex.error);}MyException& operator=(const MyException& ex) {  //等于构造if (this->error != NULL){delete[] this->error;this->error = NULL;}this->error = new char[strlen(ex.error) + 1];strcpy(this->error, ex.error);}MyException(){if (error != NULL){delete[] error;}}
public:char* error;
};
void func03() {throw MyException("我刚写的异常!");
}
void test01(){try {func01();}catch (int e) {cout << "异常捕获!" << endl;}
//----------------------------------------try {func02();}catch (char* e) {cout << "异常捕获!" << endl;}
//-----------------------------------------try {func03();}catch (MyException e) {e.what();}
}int main()
{MyException e1=MyException("dd");  //拷贝构造MyException e2 = e1;  //等于构造test01();return 0;
}

运行结果: 

5、异常生命周期

#include<iostream>
using namespace std;class MyException {
public:MyException() {cout << "构造函数" << endl;}MyException(const MyException& ex) {    //拷贝构造cout << "拷贝构造函数" << endl;}~MyException() {cout << "析构函数" << endl;}};
void func() {//throw MyException();  //创建匿名对象,调用构造函数//throw &(MyException());  //创建匿名对象,调用构造函数throw new MyException();
}
void test01() {//普通类型元素 引用 指针//普通类型元素 catch处理完后就析构//引用的话 不用调用拷贝构造 catch处理完后就析构//指针的话,需要new一个异常,否则在捕捉异常前就已经析构try {func();}//catch (MyException e) { //用MyException元素接,相当于将上面的MyException()拷贝一份传给e,调用拷贝构造//	cout << "异常捕获" << endl;//}//catch (MyException& e) { //用MyException元素接,相当于将上面的MyException()拷贝一份传给e,调用拷贝构造//	cout << "异常捕获" << endl;//}catch (MyException* e) { //用MyException元素接,相当于将上面的MyException()拷贝一份传给e,调用拷贝构造cout << "异常捕获" << endl;delete e;}
}int main()
{test01();return 0;
}

运行结果: 

6、c++异常库举例

#include<iostream>
#include<stdexcept>
using namespace std;class Person {
public:Person() {mAge = 0;}void setAge(int age){if (age < 0 || age>100) {throw out_of_range("年龄在0-100之间!");}this->mAge = age;}
public:int mAge;
};
void test01(){Person p;try {p.setAge(1000);}catch (out_of_range e) {cout << e.what() << endl;}catch (exception e) {cout << e.what() << endl;}
}class MyOutOfRange : public exception {
public:MyOutOfRange(char* error) {pError = new char[strlen(error) + 1];strcpy(pError, error);}virtual char const* what() const {return pError;}MyOutOfRange() {if (pError != NULL) {delete[] pError;}}
public:char* pError;
};
void func02() {throw MyOutOfRange("我自己抛出的异常");
}
void test02() {try {func02();}catch (exception& e) {cout << e.what() << endl;}
}
int main() {test01();test02();return 0;
}

运行结果: 

7、继承在异常中的应用

#include<iostream>
using namespace std;//异常基类
class BaseMyException {
public:virtual void what()=0;virtual ~BaseMyException() {};
};
class TargetSpaceNullException :public BaseMyException {
public:virtual void what() {cout << "目标空间为空!" << endl;}~TargetSpaceNullException(){}
};
class SourceSpaceNullException :public BaseMyException {
public:virtual void what() {cout << "源空间为空" << endl;}~SourceSpaceNullException() {}
};void copy_str(char* target, char* source){if (target == NULL){//cout << "目标空间为空" << endl;throw TargetSpaceNullException();return;}if (source == NULL) {throw SourceSpaceNullException();//cout << "源空间为空" << endl;return;}int len = strlen(source)+1;while (*source != '\0') {*target = *source;source++;target++;}
}int main()
{char* source = "abcdefg";char buf[1024] = { 0 };cout << "copy" << endl;try {copy_str(NULL, source);}catch (BaseMyException& e) {e.what();}cout << buf << endl;return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 并发组件_Java 并发计数组件Striped64详解

作者&#xff1a; 一字马胡转载标志 【2017-11-03】更新日志日期更新内容备注2017-11-03添加转载标志持续更新Java Striped64Striped64是在java8中添加用来支持累加器的并发组件&#xff0c;它可以在并发环境下使用来做某种计数&#xff0c;Striped64的设计思路是在竞争激烈的时…

ubuntu的MySQL远程数据库连接问题查找

1、开放端口3306 2、添加权限 3、服务器本身没有在安全组规则中开放权限 添加安全组规则后重试。

java中集合怎么定义_Java集合系列(一):集合的定义及分类

1. 集合的定义什么是集合呢&#xff1f;定义&#xff1a;集合是一个存放对象的引用的容器。在Java中&#xff0c;集合位于java.util包下。2. 集合和数组的区别(面试常问)提到容器&#xff0c;就会想起数组&#xff0c;那么集合和数组的区别是什么呢&#xff1f;(这里是重点&…

STL6-输入输出流

cout 是 console output 缩写 程序 和键盘 之间有一个输入缓冲区 程序 和 显示器 之间有一个输出缓冲区 #include<iostream> #include<windows.h> #include<iomanip> using namespace std; #if 0 cout << "dd"; //全局流对象&#xff0c;默…

azul java_Java版本更新重大提醒 - Azul

2019年1月对于Java开发人员和用户都特别重要。原因是Oracle JDK 8发布了更新202&#xff0c;这是Oracle的JDK 8的最终公开更新(针对商业用户)。用户现在需要仔细考虑将来如何更新升级Java版本了。对于非商业桌面用户&#xff0c;将继续通过现有Java Update机制提供对Oracle Jav…

java 自定义 钩子_Java添加关闭钩子里面的方法

在我的代码中&#xff0c;我使用CompletionService和ExecutorService来启动一堆Thread来执行某些任务(这可能需要很长时间) . 所以我有一个创建ExecutorService和CompletionService的方法&#xff0c;然后开始提交线程然后获取结果 . 我想添加一个关闭钩子&#xff0c;以便优雅…

Ubuntu nginx+uwsgi部署Django项目

前提条件&#xff1a;首先项目使用一下命令启动成功后&#xff0c;输入公网ip后可以启动成功 python manage.py runserver 0.0.0.0:80 一、阿里云配置安全组 添加8000端口 二、安装配置uwsgi 1、确定django项目可以正常运行了&#xff0c;ctrlc停止项目&#xff0c;下面我们来…

STL7-基础

1、容器可以嵌套容器 2、容器分为序列式容器和关联式容器 序列式容器&#xff1a;容器的元素的位置是由进入容器时机和地点来决定 关联式容器&#xff1a;容器已经有规则&#xff0c;进入容器的元素的位置不是由进入容器时机和地点来决定 只与此容器的排列规则有关 3、迭代…

java 0xaarrggbb 转换_RRGGBBAA或者RRGGBB转换成rgba()

//十六进制颜色值的正则表达式var reg /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;/*16进制颜色转为RGB格式*/var colorRgb function(color){if(color.length>7){var num color.slice(7,9).toUpperCase();var x opacityColor(num)color color.slice(0,7);}var sColor color…

java 假设当前时间_Java中与日期和时间相关的类和方法

一、currentTimeMillis()方法System 类中的方法 currentTimeMillis() 方法可以返回从 GMT1970 年 1 月 1 日 00 : 00 : 00 开始到当前时刻的毫秒数。System.currentTimeMillis(); //返回值为long类型二、Date类1.构造方法(1)public Date (); 以当前系统时间创建一个Date对象&am…

STL8-string容器

C 没有 string 类&#xff0c;但提供了直接对字符数组、字符串操作的函数 -> 如 str_len()等等 -> 需要包含 “string.h”#include<iostream> #include<string> using namespace std;//初始化 void test01() {string s1; //调用无参构造string s2(10, a);str…

java 采集 cms_开源 java CMS - FreeCMS2.3 Web页面信息采集

Web页面信息采集从FreeCMS 2.1开始支持通过简单配置即可抓取目标网页信息&#xff0c;支持增量式采集、关键字替换、定时采集&#xff0c;同一采集规则可采集多个页面(静态和动态)&#xff0c;可采集多种信息属性&#xff0c;可自动审核且静态化信息页面。采集规则管理从左侧管…

Python中reshape函数参数-1的意思?

import numpy as np c np.array([[1,2,3],[4,5,6]]) print(2行3列) print(c.reshape(2,3)) print(3行2列) print(c.reshape(3,2)) print(我也不知道几行&#xff0c;反正是一列) print(c.reshape(-1,1)) print(我也不知道几列&#xff0c;反正是一行) print(c.reshape(1,-1)) …

java浮点数四舍五入_Java小程序练习--浮点数的四舍五入

今天学习到了关于浮点数的知识&#xff0c;而后便编写了一个小demo&#xff0c;实现浮点数的四舍五入&#xff0c;保留两位小数。具体实现思路如下:1.获取用户输入的数字&#xff0c;将其保存到double型变量中&#xff1b;2.因为要保存到小数点后的两位&#xff0c;将该数乘以1…

STL9-vector容器

vector容器 动态数组 可变数组 vector容器 单口容器 vector实现动态增长&#xff1a; 当插入新元素时&#xff0c;如果空间不足&#xff0c;那么vector会重新申请更大内存空间&#xff08;默认二倍&#xff09;&#xff0c;将原空间数据拷贝到新空间&#xff0c;释放旧空…

函数返回值失效

#include<stdio.h> #include<stdlib.h> #include<string.h> #if 1 char* getMen2() {char buf[64]; //临时变量&#xff0c;栈区存放strcpy(buf, "abccddeeff");printf("buf:%s\n", buf);return buf; //此处并不是把内存块64个字节ret…

mysql突然出现慢sql_Mysql开启慢SQL并分析原因

第一步.开启mysql慢查询方式一:修改配置文件Windows&#xff1a;Windows 的配置文件为 my.ini&#xff0c;一般在 MySQL 的安装目录下或者 c:\Windows 下。Linux&#xff1a;Linux 的配置文件为 my.cnf &#xff0c;一般在 /etc 下在 my.ini 增加几行:[mysqlld]long_query_time…

STL10-deque容器

deque 双端队列 deque 删除操作 deque案例&#xff1a; #if 1 #include<iostream> #include<deque> using namespace std; void PrintDeque(deque<int>& d) {for (deque<int>::iterator it d.begin(); it ! d.end(); it) {cout << *it <…

php mysql 平均分_平均评级计算mysql php

我想计算每个用户的平均评分 .我有三张 table .表评级id |order_id |rate------------------1 | 52 |82 | 51 |43 | 52 |24 | 51 |7表顺序这里做的是驱动程序表IDid |did------------------52 | 551 | 735 | 644 | 8表驱动程序id |name------------------5 | test17 | test28 |…

Leedcode4-sort listnode 归并排序

#include<iostream> using namespace std;//Sort a linked list in O(n log n) time using constant space complexity.//Definition for singly-linked list. //归并排序 #if 0 struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}}; str…