【第八天】C++异常的抛出、捕获以及标准异常库

一、异常的概述

        异常:是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要 读取的文件不存在,空指针,内存不足,访问非法内存等等)。(异常是一个类。)异常处理就是处理程序中的错误。

        基本思想:让一个函数在发现了自己无法处理的错误时抛出(throw)一个异常,然后它的(直接或者间接)调用者能够处理这个问题。即将问题检测和问题处理相分离。遇到错误 抛出异常 捕获异常。

c++异常机制相比C语言异常处理的优势:

  1. C语言中处理异常的函数返回值标识可以忽略,但异常不可忽略。(忽略异常 程序结束)
  2. 整型返回值没有任何语义信息。而异常却包含语义信息,有时你从类名就能 够体现出来

二、异常的抛出、捕获 

        涉及到三个关键字:try、catch、throw。

  • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
  • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常catch 关键字用于捕获异常。
  • try: try块中放置可能抛出异常的代码,try 块中的代码被称为保护代码,块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。

 try/catch 语句的语法如下所示: 

try
{
throw 异常值;
}
catch(异常类型1 异常值1)
{
    处理异常的代码1;
}
catch(异常类型2 异常值2)
{
    处理异常的代码2;
}
catch(...)//任何异常都捕获
{
    处理异常的代码3;
}

具体案例:

        若有异常则通过thow 操作创建一个异常对象并抛出。将可能抛出异常的程序段放到try块之中。catch子句会根据出现的先后顺序被检查,匹配的catch语句捕获并处理异常(或继续抛出异常),如果在try 段执行期间没有引起异常,那么跟在try后面的catch字句就不会执行。如果匹配的处理未找到,则运行函数terminate将自动被调用,其缺省功能调用abort终止程序。处理不了的异常,可以在 catch的最后一个分支,使用throw,向上抛。 

 以除法为例:

 三、解旋

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

try
{
    Data ob1;
    Data ob2;
    Data ob3;
    throw 1;//抛出异常后 ob3 ob2 ob1依次自动析构(栈解旋)
}

案例说明: 

 四、异常的接口声明

        异常的接口声明:函数声明可以捕获哪些类型的异常。

函数调用写在try语句中,有相应的捕获处理语句(catch)情况下:

 捕获情况:

 五、异常变量的生命周期

编写异常类:

class MyException//异常类
{
public:
    MyException(){
        cout << "异常变量构造" << endl;
    };
    MyException(const MyException & e)
    {
        cout << "拷贝构造" << endl;
    }
    ~MyException()
    {
        cout << "异常变量析构" << endl;
    }
};

1、以普通对象 接异常值

        两次构造析构

 2、以对象指针 接异常值

有delete释放,一次构造析构

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

不需要delete,一次构造析构

六、异常的多态

        父类引用 可以捕获搭配该父类派生出的所有子类的子类

 七、标准异常库

        C++ 提供了一系列标准的异常,定义在 <exception> 中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的

每个异常的说明: 

 

八、编写自己的异常 

        编写自己的异常要基于标准异常,从exception上继承。

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,动态链接(Dynamic Link Library, DLL)崩溃通常指的是由于运行时错误,如内存泄漏、未初始化的指针引用、除以零错误或其他程序错误导致的程序终止。当动态中的代码抛出异常,如果没有得到适当的处理,程序就会崩溃。 捕获异常(Exception Handling)是C++提供的一种机制,用于处理运行时错误。在遇到异常时,程序不会立即终止,而是跳转到预先设置的异常处理代码块(try-catch-finally)。以下是异常处理的基本步骤: 1. **try**块:包含可能抛出异常的代码。如果在这个块内发生异常,程序控制权将立即转移到对应的catch块。 2. **catch**块:定义了异常类型,试图捕获特定类型的异常。如果try块中的异常类型匹配catch块中的异常类型,控制权会进入该块执行相应的错误处理代码。 3. **throw**语句:用于手动引发异常。在程序中,可以使用throw表达式来抛出一个自定义的异常对象。 4. **catch(...)**:这是泛型的catch块,用于捕获所有未被其他catch块匹配的异常。通常用在没有特定处理的情况下,或者是为了记录详细的错误信息。 5. **finally**块(可选):无论是否发生异常,finally块中的代码都会被执行,通常用于资源清理操作。 相关问题: 1. C++中常见的异常类型有哪些? 2. 如何在catch块中处理异常,比如记录日志或恢复部分功能? 3. 如何避免动态崩溃,特别是当调用第三方时? 4. C++中如何自定义异常类? 5. 动态链接崩溃后,如何调试和追踪错误源?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值