iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么深入了解C++异常处理
  • 685
分享到

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

2023-06-22 02:06:56 685人浏览 安东尼
摘要

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

本篇文章为大家展示了怎么深入了解c++异常处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

基本的异常处理

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

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

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

捕获和处理异常:

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

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

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

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

怎么抛出异常

//求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函数终止程序 

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

捕获和处理异常

//try 与catch必须是一起出现,并且他们的括号{}不能省略try{//正常需要检查是否存在异常的代码 }catch(类型)     //理解为switch中case语句{    //处理是根据抛出数据类型决定如何处理 匹配项 匹配抛出异常的类型} //一个try可以对应多个catchtry{//...    }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时不能直接当作stringif(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 2array[*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"

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

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

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

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

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

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

发现代码出现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函数中断程序,一般这种错误都是特殊错误

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

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

值:3

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

上述内容就是怎么深入了解C++异常处理,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网其他教程频道。

--结束END--

本文标题: 怎么深入了解C++异常处理

本文链接: https://www.lsjlt.com/news/301905.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 怎么深入了解C++异常处理
    本篇文章为大家展示了怎么深入了解C++异常处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。基本的异常处理异常处理机制:暂缓问题处理,不在当前函数中处理,在他的调用者中处理(先上车,后补票)什么是异...
    99+
    2023-06-22
  • 深入了解C++异常处理
    目录基本的异常处理怎么抛出异常捕获和处理异常不存在异常的描述 --- 标识性作用    删减符 ...异常处理中的传参操作  --- 可以写一个变量进去可以抛出自己类的对象标准库当中...
    99+
    2024-04-02
  • 深入了解Python的异常处理机制
    目录什么是异常?异常处理try-except 格式一-try...except...格式二-try...except {errorName}...格式三-try...except {...
    99+
    2024-04-02
  • Java异常处理深入理解
    目录图片解析:异常的处理:处理机制一:try-catch-finallyfinally的再说明:处理机制二:throws + 异常类型开发中应该如何选择两种处理方式?如何自定义异常类...
    99+
    2024-04-02
  • Java异常处理机制深入理解
    目录1.初识异常2.异常的基本用法异常处理流程3.为什么要使用异常?异常应只用于异常的情况4. 异常的种类 4.1 受查异常解决方案:4.2非受查异常5.如何使用异常避免不...
    99+
    2024-04-02
  • YII2 全局异常处理深入讲解
    首先,我们必须理性认识到,任何一个即使稳定的系统中也是存在着大量的 bug,不管是因为什么原因导致的错误,我们都是需要做好防范的,最好的结果当然是将异常纠正过来,返回客户端一个正确...
    99+
    2024-04-02
  • C#异常怎么处理
    这篇文章主要讲解了“C#异常怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#异常怎么处理”吧!异常是程序运行中发生的错误,C#异常处理是程序设计的一部分。在C#异常处理是通过Exc...
    99+
    2023-06-17
  • C++ 函数异常原理探究:了解异常处理底层
    c++++异常处理原理:抛出异常:使用throw关键字抛出异常对象。捕获异常:使用catch关键字捕获特定类型的异常。try-catch块:将代码段放在try-catch块中处理异常。实...
    99+
    2024-05-01
    c++ 异常
  • 带你深入理解Java异常
    💕“人生就像一盘棋,有时候你慢一步,就输掉了一局。但只要你不停止思考和行动,就永远有机会翻盘。”💕 🐼作者:不能再留遗憾了🐼 &#x...
    99+
    2023-10-05
    java jvm 开发语言
  • 深入了解C++和C语言的异同
    C++和C语言是两种流行的编程语言,它们在很多方面都相似,但也有许多显著的差异。本文将深入探讨C++和C语言的异同点,并通过具体的代码示例来说明它们之间的差异。 一、基本语法和结构差异...
    99+
    2024-04-02
  • C#中怎么处理异常
    在C#中,可以使用try-catch语句来处理异常。try块中包含可能会抛出异常的代码,而catch块中包含处理异常的代码。示例代码...
    99+
    2024-04-03
    C#
  • Java深入讲解异常处理try catch的使用
    目录1.try-catch异常处理说明2.try-catch异常处理细节示例01测试结果01示例02测试结果021.try-catch异常处理说明 Java提供try和catch块来...
    99+
    2024-04-02
  • 怎么解决C++异常问题处理
    今天就跟大家聊聊有关怎么解决C++异常问题处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。处理C++异常问题会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们。学习各种...
    99+
    2023-06-17
  • 深入理解java的异常情况
    目录什么是异常?异常的存在形式Java异常体系异常的分类运行时异常编译时异常错误 Error编译时异常和运行时异常的区别常见的异常防御式编程Java处理异常的语法异常抛出—throw...
    99+
    2024-04-02
  • 深入理解Java中的java.lang.ArithmeticException异常
    引言 在Java中,异常处理是一种重要的编程机制。异常是指在程序执行过程中发生的错误或异常情况,它打破了正常的程序流程,需要进行相应的处理。Java提供了丰富的异常类和异常处理语法,使开发人员能够更好...
    99+
    2023-10-18
    java 开发语言
  • 深入解析java.lang.IllegalStateException异常
    异常概述 什么是异常 异常是程序在执行过程中遇到的错误或异常情况。在Java中,异常是指在程序运行期间发生的错误,它可以打破程序的正常流程,并且可能导致程序终止。 异常的分类 异常分为两种类型:受检异...
    99+
    2023-08-31
    java python 大数据
  • 深入解析java.lang.ClassNotFoundException异常
    1. 引言 在Java开发中,我们经常会遇到各种异常。其中,java.lang.ClassNotFoundException异常是一种常见的异常。本文将深入解析这个异常的定义、作用、产生原因以及常见场景。 1.1 介绍ClassNotFou...
    99+
    2023-08-30
    java 开发语言
  • Scala异常处理的方法深入分析
    目录Scala异常处理异常处理的概述Scala中的异常种类Scala中的异常格式Scala中的异常示例Scala中输出异常结果的方法常用的方法特有的类和方法语法示例Scala自定义异...
    99+
    2023-05-14
    Scala异常处理 Scala异常处理机制
  • C++异常处理入门(try和catch)
    目录捕获异常 发生异常的位置 开发程序是一项“烧脑”的工作,程序员不但要经过长期的知识学习和思维训练,还要做到一丝不苟,注意每一个细节和边界。即使这样,也不能防止程序出错。 专家指...
    99+
    2024-04-02
  • 一篇文章带你深入了解Java异常
    目录一.初识异常1.常见的异常类型<1>除以0<2>数组下标越界<3>访问null对象2.防御式编程<1>LBYL<2>E...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作