我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入了解C++异常处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入了解C++异常处理

基本的异常处理

异常处理机制:暂缓问题处理,不在当前函数中处理,在他的调用者中处理(先上车,后补票)

什么是异常:任何东西都可以认为是异常,错误只是异常的一种

异常一旦被抛出,不做处理,如果引发异常,会调用默认abort函数终止程序

捕获和处理异常:

throw 抛出异常: (值是任何类型都可以,只是我们处理异常的一个参照,类似返回值)

try(检查,捕获)和catch(处理异常): 必须是一起出现,并且它们的括号{ }不能省略

tip:   任何东西都可以认为是异常,错误只是异常中的一种---出现一种情况不能让程序正常运行

怎么抛出异常


//求a和b的余数    怎么抛出异常
int division(int a,int b){
    if(b==0)
        throw 0;    //抛出一个值(任意)--->之后处理
    return a/b;
}
void print(int a,int b){
 
    cout<<division(a,b);
}
int main(){
 
    print(1,0);
 
}

异常一旦被抛出,不做处理,如果引发异常,会调用默认abort函数终止程序 

捕获和处理异常


//try 与catch必须是一起出现,并且他们的括号{}不能省略
try
{
	//正常需要检查是否存在异常的代码 
}
catch(类型)     //理解为switch中case语句
{
    //处理是根据抛出数据类型决定如何处理 匹配项 匹配抛出异常的类型
}
 
//一个try可以对应多个catch
try
{
	//...    
}
catch(int)
{
	    
}
catch(double)
{
    
}
catch(string)
{
	    
}
//catch和if else_if 执行机制是一样的,只能执行一个匹配项

小知识:

  • 对try{ }   catch(){ } 的理解:在当前位置引发异常,直接从这个位置跳到catch的位置执行catch的代码 --- 类似switch case 语句
  • catch中int和char不会做转换
  • 写两个相同的类型不被允许,哪段代码先引发异常就先调用catch

int division(int a,int b){
    if(b==0)
        throw 0;    
    return a/b;
}
void print(int a,int b){
 
    cout<<division(a,b);
}
int main(){
 
    try
    {
        print(1,0);     //检查异常
        cout<<"别的代码"<<endl;    //这一句不会运行,会直接跳到catch
    }    
    catch(int)                    //抛出的是int类型,捕获int类型
    {
        cout<<"除数不能为0"<<endl;
    }
}

程序能抛出(存在)多个异常,但是只能同时处理1个异常,不能同时引发多个异常

不存在异常的描述 --- 标识性作用    

  • throw ()
  • noexcept

//某个函数不存在异常,在某个函数后面用throw() 描述,表示它不存在异常
void  print() throw() 
{
	cout << "当前函数不存在抛出异常操作" << endl;
}
void printData() noexcept 
{
	cout << "c++新标准中的关键字: 不存在抛出异常操作" << endl;
	//throw 0;  一旦说明没有异常操作,就不能抛出
}

删减符 ...

任何类型的异常都捕获    不管抛出啥,在哪里抛出的,只要引发异常都可以捕获到


catch(...)
{
 
    cout <<"捕获任何类型的异常"<< endl;
}

异常处理中的传参操作  --- 可以写一个变量进去

catch(int a)

注意c++中string的处理   

代码解析:

对  通过抛出字符串,隐藏了一个传参操作  的理解


int divisor(int a, int b) 
{
	if (b == 0)
		throw string("除数不能为0");    
	return a / b;
}
 
int main()
{
	try
	{
		divisor(1, 0);   
	}
	catch (string str)    //把throw的内容赋值给str    str="除数不能为0"
	{
		cout << str << endl;
	}
}

注意string类型与const char* 类型区别  --- 出现类型不匹配,c++对传参类型要求更严格


int divisor(int a, int b) 
{
	if (b == 0)
		throw "除数不能为0";    //抛出异常  解析为char* 类型 写catch时不能直接当作string
	if(b==1)
		throw "除数不能为1";    
	if(b==2)
		throw string("除数不能为2");  //需构造无名参数作捕获对象处理--->需要自己触发
	return a / b;
}
 
int main()
{
	try
	{
		divisor(1, 0);       //直接触发异常
	}
	catch (const char* str)  //抛出的是char* 类型,不能当作string
	{
		cout << str << endl;
	}
	try
	{
		divisor(1, 2);
	}
	catch (string str)    //如果要捕获string类型,需要自己构造一个string对象返回
	{
		cout << str << endl;    //直接输出str
	}
}

可以抛出自己类的对象


class Error 
{
public:
	Error(const char* str = "未知错误") :str(str) {}
	const char* what()const 
	{
		return str.c_str();
	}
protected:
	string str;
};
 
void insertArray(int array[], int* curNum, int posData,int maxLength) 
{
	if (*curNum >= maxLength)  //3>=3
	{
		throw  Error("数组下标溢出!");
	}
	//0 1 2
	array[*curNum] = posData;  //array[3]=3
	(*curNum)++;
}
 
int main(){
 
    try
	{
		int array[3] = { 0,0,0 };
		int curNum = 0;
		for (int i = 0; i < 4; i++) 
		{
			insertArray(array, &curNum, i, 3);
		}
	}
	catch (Error str) 
	{
		cout << str.what() << endl;
	}
 
    return 0;
}

标准库当中的异常类


 #include<exception>    //父类(基类)

子类很多,子类描述的问题不同而已

例子: const char* _ptr; 一个数据成员,用于描述标准库当中异常的字符串,用字符指针存放那个字符串

what( )方法  用于返回数据成员的        1.虚函数        2.不存在异常

return _ptr ? _ptr : "unknow";判断char* 类型的指针是不是为空,不等于空,返回你描述的错误,等于空(由于没有传参),返回未知错误"unknow"

引发标准库中内存申请失败的异常

发现代码出现abort( )错误,可以通过这种方式找到,这里是针对内存申请失败做了单一处理,如果不做处理,会直接调用abort函数终止程序


#include <exception>
#include <iostream>
using namespace std;
class Exception 
{
public:
	Exception(const char* ptr="UNKNOW") :ptr(const_cast<char*>(ptr)){} 
	virtual const char* what() const    //父类是虚函数 且不存在异常
	{
		return ptr;
	}
protected:
	char* ptr;
};
//子类继承父类    
class Bad_alloc :public Exception
{
public:
	Bad_alloc(const char* _Message = "bad exception") :Exception(_Message) {} 
protected:
};
//子类继承父类    调用父类构造函数
class Run_time :public Exception
{
public:
	Run_time(const char* _Message = "run_time error") :Exception(_Message) {}
protected:
};
 
int main() 
{
	try 
	{
		while (1) 
		{
			int* p = new int[1024*1024*10];//一直做内存申请,不做释放,最后一定会内存申请失败
		}
	}
	catch (bad_alloc& object) 
    {
 
		cout << object.what() << endl;
	}
	return 0;
}

 
bad allocation    //调用时抛出 bad allocation 是子类对象调用继承下来的what()方法
 
//一般写代码出现莫名的中断,原因是不做异常处理,引发了abort函数中断程序,一般这种错误都是特殊错误

标准库中传两个参数起到标识作用,由于:引发了不同的错误,不同错误对应了不同的错误编码 对这些错误有特定的描述 ---> 工具 ---> 错误查找 ---> 输入错误编码

值:3

错误信息:系统找不到指定的路径 

以上就是深入了解C++异常处理的详细内容,更多关于C++异常处理的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入了解C++异常处理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么深入了解C++异常处理

本篇文章为大家展示了怎么深入了解C++异常处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。基本的异常处理异常处理机制:暂缓问题处理,不在当前函数中处理,在他的调用者中处理(先上车,后补票)什么是异
2023-06-22

深入理解python try异常处理机制

深入理解python try异常处理机制#python的try语句有两种风格 #一:种是处理异常(try/except/else) #二:种是无论是否发生异常都将执行最后的代码(try/finally)try/except/else风格 t
2022-06-04

C++ 函数异常原理探究:了解异常处理底层

c++++异常处理原理:抛出异常:使用throw关键字抛出异常对象。捕获异常:使用catch关键字捕获特定类型的异常。try-catch块:将代码段放在try-catch块中处理异常。实战案例:throwerror()函数抛出异常,main
C++ 函数异常原理探究:了解异常处理底层
2024-05-01

深入解析java.lang.ClassNotFoundException异常

1. 引言 在Java开发中,我们经常会遇到各种异常。其中,java.lang.ClassNotFoundException异常是一种常见的异常。本文将深入解析这个异常的定义、作用、产生原因以及常见场景。 1.1 介绍ClassNotFou
2023-08-30

Scala异常处理的方法深入分析

Scala是一种多范式的编程语言,支持面向对象和函数式编程。Scala也支持异常处理,即在程序运行过程中发生意外或错误时,采取相应的措施
2023-05-14

深入浅析java中connection reset 的异常处理

今天就跟大家聊聊有关深入浅析java中connection reset 的异常处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Java中常看见的几个connection rest
2023-05-31

深入探讨JAVA中的异常与错误处理

这篇文章详细介绍了JAVA中的异常与错误处理,有需要的朋友可以参考一下
2022-11-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录