首页 > 其他分享 >20_异常

20_异常

时间:2023-10-15 14:56:51浏览次数:30  
标签:20 cout 抛出 try catch 异常 throw

异常

int ret = 0;
try
{
    //throw 1;
    //throw 'A';
    throw 2.14f;
}
catch(int e)
{
    cout << "int异常值为: " << e << endl;
}
catch(char e)
{
    cout << "char异常值为: " << e << endl;
}
catch(...) //捕获所有异常
{
    cout << "其他异常值为: " << endl;
}

栈解旋

异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反,这—过程称为栈的解旋.

try
{
    Data ob1;
    Data ob2;
    Data ob3;
    throw 1; //抛出异常后 ob3 ob2 ob1 依次自动释放(栈解旋)
}
catch(int e)
{
    cout << "int异常值为: " << e << endl;
}
catch(char e)
{
    cout << "char异常值为: " << e << endl;
}
catch(...)
{
    cout << "其他异常值为: " << endl;
}

image-20231011185206213

先释放对象再捕获异常

异常的接口声明

异常的接口声明: 可以抛出哪些类型的异常

函数默认 可以抛出任何类型的异常(推荐)

void fun()
{
    throw 1; //ok
    throw '1'; //ok
    throw "hello"; //ok

只抛出特定类型的异常

void fun02() throw(int, char)
{
	throw 1; //ok
	throw '1'; //ok
	throw "hello"; //抛出 不能捕获
}

不能抛出任何异常

void fun03() throw()
{
    throw 1; //不能抛出
    throw 'o'; //不能抛出
    throw "dfj"; //不能抛出
}

异常变量的生命周期

image-20231011190031173

以普通对象接异常值

image-20231011190141750

以对象指针 接异常值

try
{
    throw new MyException;
}
catch(MyException *e) //指针对象接异常(delete释放)
{
    cout << "普通对象接异常" << endl;
    delete e;
}

image-20231012105435563

对象引用接异常值(推荐)

try
{
    throw MyException();
}
catch(MyException &e)
{
    cout << "普通对象接异常" << endl;
}

image-20231012105759081

异常的多态

//异常基类
class BaseException
{
public:
    virtual void printError(){};
};

//空指针异常
class NullPointerException: public BaseException
{
public:
    virtual void printError()
    {
        cout << "空指针异常!" << endl;
    }
};

//越界异常
class OutOfRangException: public BaseException
{
public:
    virtual void printError()
    {
        cout << "越界异常!" << endl;
    }
};

void doWork()
{
    //throw NullPointerException();
    throw OutOfRangeException();
}

int main()
{
    try
    {
        doWork();
    }
    catch(BaseException& ex) //父类引用 可以捕获搭配该父类派生出的所有子类的子类
    {
        ex.printError();
    }
}

C++标准异常

image-20231012121712040

image-20231012121752543

image-20231012121814446

image-20231012121825400

try
{
    throw out_of_range("哈哈, 我越界了");
    //throw bad_alloc();
}
catch(exception &e)
{
    //what()存放的是异常信息(char *方式存在)
    cout << e.what() << endl;
}

image-20231012122016344

编写自己的异常

基于标准异常基类 编写自己的异常类

#include <iostream>

using namespace std;

class NewException: public exception
{
private:
    string msg;
public:
    NewException(){}
    NewException(string msg)
    {
        this->msg = msg;
    }
    //重写父类的what
    virtual const char* what() const throw() //防止父类在子类前抛出标准异常
    {
        //将string转换成char*
        return this->msg.c_str();
    }
    ~NewException(){}
};

int main()
{
    try
    {
        throw NewException("哈哈, 自定义异常");
    }
    catch(exception &e)
    {
        cout << e.what() << endl;
    }
    return 0;
}

标签:20,cout,抛出,try,catch,异常,throw
From: https://www.cnblogs.com/mzx233/p/17765627.html

相关文章

  • 2023-2024-1 学号20231303 《计算机基础与程序设计》赵泊瑄第三周学习总结
    2023-2024-1学号20231303《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程如2023-2024-1-计算机基础与程序设计这个作业要求在哪里作业要求的链接如2023-2024-1计算机基础与程序设计第三周作业)这个作业的目标总结第三周学习收获作业正......
  • 2023-2024-1 20231314 许城铭 《计算机基础与程序设计》第3周学习总结
    2023-2024-120231314许城铭《计算机基础与程序设计》第3周学习总结作业信息这个作业属于哪个课程<班级的链接>(2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第三周作业)这个作业的目标<自学教材:计算......
  • 2023-2024-1 20231405《计算机基础与程序设计》第3周学习总结
    2023-2024-120231405《计算机基础与程序设计》第3周学习总结作业信息作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13009作业的目标自学《计算机科学......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记5
    20211306密码系统设计与实现课程学习笔记5任务详情自学教材第11章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题......
  • 2023-2024-1 20231327 司宏林 《计算机基础与程序设计》第3周学习总结
    学期(2023-2024-1)学号(20231327)《计算机基础与程序设计》第3周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2023-2024-1计算机基础与程序设计第3周作业)这个作业的目标<写上具体方面>......
  • Adobe Acrobat Pro dc 2019完整中文版下载/DC软件下载包括最新版
    AdobeAcrobatDC2019最新版-简称DC2019是一款综合性的PDF编辑和阅读软件,能够支持随时随地开展工作的完整PDF解决方案。新版本进行了重新设计,可以在桌面、Web和移动设备(包括启用触屏的设备)上提供简单一致的用户体验。比如acrobat2019利用全局签名工具对文档进行签名时,您只需单击一......
  • DC 2021软件下载、Adobe Acrobat DC Mac/Win版下载
    AdobeAcrobatDC是由Adobe公司推出的一款功能十分强大的PDF阅读工具,AdobeAcrobatDC是当今PDF文件最完美的解析工具,它不仅可以让用户查看PDF文件,还可以轻松地制作PDF文件,并对其进行注释、编辑、导出等操作。AdobeAcrobatDC还能利用ps的图像编辑功能。软件地址:看置顶帖DC2021软......
  • Adobe Character Animator(CH版)2020 Mac 软件下载 永久使用
    AdobeCharacterAnimator(CH版)2020Mac 是一款动作捕获和角色动画制作工具,允许您使用自己的图稿创造富有表现力的角色,实时将2D人物制成动画,创造人物并用您自己的表演让它动起来。CharacterAnimator使用您的实时表情和动作将人物动起来。因此,当您微笑或点头时,您的人物也会做出......
  • CH2021中文版下载、ch软件下载带安装步骤
    CH2021又名AdobeCharacterAnimator2021是一款十分实用的动画制作应用软件,该软件是由大家耳熟能详的Adobe公司开发的。用户们可以通过这款软件制作各种各样的动画表情包,还可以通过该软件来创作一些表情丰富的画面人物以及场景,通过软件内置的人物和模仿功能,能让模拟人物做出与本......
  • 升级Lync Server 2013到Skype for Business 2019(十一)
    写在前面本章将介绍如何将LyncServer2013旧有边缘服务,切换到新的SkypeforBusiness2019边缘服务器上。切换SkypeforBusiness2019服务器添加SkypeforBusiness2019服务器公网DNS。这些DNS主要包括如下内容:项目DNS配置类型IP外部访问access.contoso.comA公网IP地址外部Web会......