C++57个入门知识点_57 异常处理(为了程序健壮性,使用try{}catch(){}将代码包裹,出现异常时可以被程序接到,而不会造成程序阻塞或崩溃;需要在VS中打开设置;exception类)

本文主要是介绍C++57个入门知识点_57 异常处理(为了程序健壮性,使用try{}catch(){}将代码包裹,出现异常时可以被程序接到,而不会造成程序阻塞或崩溃;需要在VS中打开设置;exception类),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇作为C++基础知识的最后一篇,介绍如何进行代码中的异常处理。
我们在写代码的过程中,不得不考虑一些突发的情况。比如说申请内存时内存不够用了,做除法时除数为0,这些都是在运行的时候才会出现的,这时候就需要考虑在运行时出现这些情况应该怎么处理。异常处理是为了程序的鲁棒性提出的一个要求,产生的语法。在C++中使用的较少,但是在Java中到处都是,因为java中的要求更加严格。

总结:

  • 为了程序的健壮性,建议使用try{}catch(){}将代码包裹,从而在出现异常时可以被程序接到,而不会造成程序阻塞及崩溃。
  • 在写try{}catch(){}之前需要在VS中打开设置
  • 可以通过人为指定的方式,抛出指定类型的异常
  • main函数中可以进行最终的异常接收补救
  • 常用stl中的exception类来接收异常

1.为什么需要异常处理?


以下代码中,函数进行一个除法运算,本身是没有什么问题,但是用户在进行操作时可能会使用 foo(1, argc - 1);的方式, argc默认值为 1,因此就导致运行时传递到函数内的 n=0,就会报错。

#include <iostream>
using namespace std;void foo(int m, int n)
{//异常处理int t = m / n;
}//argc默认为1
int main(int argc, char* argv[])
{foo(1, argc - 1);return 0;
}

运行结果:
在这里插入图片描述
出现上面的结果是谁的错呢?好像都没错,函数和用户都是正常使用。由于只有在程序运行时才可以知道会不会出错误,所以此时我们需要对异常进行一个获取,从而使得程序不至于运行时崩溃。

2.C++中异常处理如何写?


一般我们使用以下结构获取异常

try{}
catch (...){}

3.VS编译器的设置

除了写代码,VS中还需要进行如下设置,异常才能被catch到。
在这里插入图片描述
在这里插入图片描述

4.如何抛异常,异常的类型?


上面代码中程序将异常抛出,操作器可以检测到异常,但是不知道如何去处理异常,它会将异常抛出给 catch进行处理。通过对代码的修改,可以让程序获取到异常,并进行处理。

#include <iostream>
using namespace std;void foo(int m, int n)
{//在写代码的过程中,利用try、catch包住代码,catch就可以捕捉显示异常//异常处理try {//抛出异常int t = m / n;}//...代表处理所有类型的异常catch (...) {cout << "error"<<endl;	}
}//argc默认为1
int main(int argc, char* argv[])
{foo(1, argc - 1);return 0;
}

运行结果:跳入catch()函数中
在这里插入图片描述
在写代码的过程中,利用try、catch包住代码,catch就可以捕捉显示异常,而catch (...) 中的...代表处理所有类型的异常。

  • 常见的异常中还有一种空指针异常,其异常也是可以被接住
#include <iostream>
using namespace std;void foo(int m, int n)
{//在写代码的过程中,利用try、catch包住代码,catch就可以捕捉显示异常//异常处理try {//0xc0000005异常,指针访问异常,地址不存在或异常char* p = nullptr;//空指针异常*p = 123;}//...代表处理所有类型的异常catch (...) {cout << "error"<<endl;}
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在我们利用VS写代码时一定要记得打开捕获程序异常的设置,并将代码利用try、catch包住,程序的兼容性得到一个很大的提高,再也不会被随机拥堵了。

5.人为抛出异常的方法


有时候我们需要人为的去抛异常,可以使用 throw抛出多种类型的异常。

#include <iostream>
using namespace std;void foo(int m, int n)
{//在写代码的过程中,利用try、catch包住代码,catch就可以捕捉显示异常//异常处理try {//人为抛异常throw 1;throw "Hello";}//...代表处理所有类型的异常catch (...) {cout << "error"<<endl;}
}//argc默认为1
int main(int argc, char* argv[])
{foo(1, argc - 1);return 0;
}

运行结果:catch()将所有人为抛出的异常接住
在这里插入图片描述
异常本质上是有数据类型的,像上面写到的,可以是int、float等,使用...代表所有类型的异常都可以被接住。

5.1人为抛出指定数据类型异常的方法


当想接住某种类型的异常,可以在 catch()中写出对应的类型名,具体写法如下:

#include <iostream>
using namespace std;void foo(int m, int n)
{//在写代码的过程中,利用try、catch包住代码,catch就可以捕捉显示异常//异常处理try {//人为抛异常throw 1;throw "Hello";}catch (int n) {//在catch块中写出你所关心的异常类型//获取throw 1;的异常,因为1为int型cout << n << endl;}//...代表处理所有类型的异常catch (...) {cout << "error"<<endl;}
}//argc默认为1
int main(int argc, char* argv[])
{foo(1, argc - 1);return 0;
}

运行结果:可以看到catch(int n)接到了int类型的异常,但是n值并不是1(只是接到异常,并不是值传递)
在这里插入图片描述

5.2人为抛出的异常与接收不符时会崩溃


当抛出的异常与 catch可接的异常数据类型不一致时,就会导致程序崩溃,如下抛出一个 "Hello",但是 catch可以接的是 int,就会造成崩溃。

#include <iostream>
using namespace std;void foo(int m, int n)
{//在写代码的过程中,利用try、catch包住代码,catch就可以捕捉显示异常//异常处理try {//人为抛异常//throw 1;throw "Hello";}catch (int n) {//在catch块中写出你所关心的异常类型//获取throw 1;的异常,因为1为int型cout << n << endl;}//...代表处理所有类型的异常//catch (...) {//	cout << "error"<<endl;////}
}//argc默认为1
int main(int argc, char* argv[])
{foo(1, argc - 1);return 0;
}

运行结果:程序崩溃
在这里插入图片描述
这是因为,C++中的异常处理机制,当程序去抛异常时,会找最近的catch去接,最近的接不住,就会向外去抛出异常

6.在main函数中进行最后异常接收补救


下面代码中在客户端写了 catch去接异常,也是可以接住的

#include <iostream>
using namespace std;void foo(int m, int n)
{//在写代码的过程中,利用try、catch包住代码,catch就可以捕捉显示异常//异常处理try {//人为抛异常//throw 1;throw 1.0f;//throw "Hello";}catch (int n) {//在catch块中写出你所关心的异常类型//获取throw 1;的异常,因为1为int型cout << n << endl;}}//argc默认为1
int main(int argc, char* argv[])
{try {foo(1, argc - 1);}catch (float f) {cout << f << endl;}return 0;
}

运行结果:main中的catch函数接住异常
在这里插入图片描述
假如程序出现异常无法接住,我们可以在main中使用...做最后的补救,否则出现异常后,程序只能体面的退出。

int main(int argc, char* argv[])
{try {foo(1, argc - 1);}catch (float f) {cout << f << endl;}catch (...) {cout <<"error"<< endl;}return 0;
}

运行结果:
在这里插入图片描述

7.stl中的exception类


catch()中除了可以写上面的基本数据类型,还可以写类类型,常见的在 stl中一种异常处理的种类,叫做 exception类,就会抛出一个 exception类对象,通常我们会通 过exception类对象抛出异常的内容,以供分析。以下 throw std::exception("123");123代表异常信息, e.what()将异常信息打印出来。

#include <iostream>
using namespace std;void foo(int m, int n)
{//在写代码的过程中,利用try、catch包住代码,catch就可以捕捉显示异常//异常处理try {//人为抛异常//throw 1;//throw 1.0f;//throw "Hello";}catch (int n) {//在catch块中写出你所关心的异常类型//获取throw 1;的异常,因为1为int型cout << n << endl;}}//argc默认为1
int main(int argc, char* argv[])
{try {foo(1, argc - 1);throw std::exception("123");}//可以写出类对象,exception异常类种类catch (std::exception& e) {cout << e.what() << endl;}return 0;
}

运行结果:打印出异常信息
在这里插入图片描述
一般而言,我们抛出的异常不是Int等,而是一个exception类型来携带一个字符串,exception是一个父类,抛出的异常可以是子类,最终使用exception来接。

  • 如果catch(){}中再去抛出异常,同样可以使用在外的catch来接。

8.学习视频地址:C++57个入门知识点_57 异常处理

这篇关于C++57个入门知识点_57 异常处理(为了程序健壮性,使用try{}catch(){}将代码包裹,出现异常时可以被程序接到,而不会造成程序阻塞或崩溃;需要在VS中打开设置;exception类)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310769

相关文章

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用