C++-异常处理

发布时间:2024年01月06日

1、概念

异常时程序在执行期间产生的问题。C++异常是指在程序运行时发生的特殊情况。比如string::at函数下标越界等。

异常提供了一种转移程序控制权的方式。

一旦程序出现异常没有经过处理,就会造成程序运行崩溃。

处理异常的方式有:抛出异常(throw)和捕获异常(try?-?catch)

2、抛出异常-throw语句

可以使用throw语句在代码块中的任何地方抛出异常。

throw语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出异常的类型。

抛出的异常是抛出到函数调用的上一级。

#include?<iostream>

using namespace std;

//?除法
double division(double?a,double?b)
{
    if(b?== 0)
    {
        string text("除数等于0!");
        throw?text;//抛出一个异常:异常为除数为0
    }
    return?a/b;
}
double input()
{
????cout?<< "input?开始执行" <<?endl;
    double?a;
    double?b;
????cout?<< "请输入两个浮点型:" <<?endl;
????cin?>>?a?>>?b;
    double?c?= division(a,b);   //?1?text对象在这(无人处理)
????cout?<< "input?执行结束" <<?endl;
    return?c;
}


int main()
{
????cout?<< "程序开始执行" <<?endl;
????cout?<< input() <<?endl;    //?2?text对象又到这了(还是无人处理)
????cout?<< "程序执行结束" <<?endl;
    return 0;
}

3、捕获异常

如果有一个try代码块抛出一个异常,捕获异常使用catch代码块。

#include?<iostream>
using namespace std;
//?除法
double division(double?a,double?b)
{
    if(b?== 0)
    {
        string text("除数等于0!");
        throw?text; //?抛出一个异常
    }
    return?a/b;
}
double input()
{
????cout?<< "input?开始执行" <<?endl;
    double?a;
    double?b;
????cout?<< "请输入两个浮点型:" <<?endl;
????cin?>>?a?>>?b;
    double?c?= 0;
    try //?尝试抛出一个异常
    {
????????c?= division(a,b);
    }
    catch(string &e)    //?尝试捕获一个异常(类型跟抛出的异常类型不符合,会出现捕获不到的情况)
    //catch(...)//捕获所有异常
    {
        //?验证异常类型对象
????????cout?<<?e?<<?endl;
        //?补救措施
        return 0;
    }
????cout?<< "input?执行结束" <<?endl;
    return?c;
}
int main()
{
????cout?<< "程序开始执行" <<?endl;
????cout?<< input() <<?endl;    //?2?text对象又到这了(还是无人处理)
????cout?<< "程序执行结束" <<?endl;
    return 0;
}

上述代码中可能会出现的几种情况:

  1. 无异常抛出,此时程序正常执行,不进入catch块。
  2. 异常抛出,正确捕获,此时程序进入catch块。
  3. 异常抛出,错误捕获(捕获类型不对),此时程序仍然会向上抛出寻求正确捕获,如果每一层都没有正确捕获,程序任然运行终止。
  4. 4、标准异常体系

#include<stdexcept>头文件

C++给常见的异常类型进行了定义和分类,引入#include<stdexcept>头文件后可以使用。

这个体系还是太薄弱了,因此可以对其进行拓展。

自定义一个类型,继承自某个异常类型即可。

一个标注捕获的例子:

#include?<iostream>
#include?<stdexcept>
using namespace std;
int main()
{
    string?s?= "helloworld";
    try
    {
????????cout?<<?s.at(100) <<?endl;//异常,下标越界
    }
    catch(out_of_range &e)
    {
        //?输出错误信息
????????cout?<<?e.what() <<?endl;

        //?补救措施
????????cout?<< -1 <<?endl;
    }
    return 0;
}

一个抛出自定义异常的例子:

#include?<iostream>
#include?<stdexcept>
using namespace std;
//?继承于exception
class MyException:public?exception
{
public:
    //?覆盖what函数
    //?throw():异常规格说明
    //?表示此函数不会出现任何异常的抛出
    const char* what() const throw()
    {
        return "自定义异常类型" ;
    }
};
void show(string?a,string?b)
{
    if(a?== "#" ||?b?== "#")
    {
        throw MyException();
    }
????cout?<<?a?<<?b?<<?endl;
}
int main()
{
????cout?<< "请输入两个字符串" <<?endl;
    string?a;
    string?b;
????cin?>>?a?>>?b;
    try
    {
        show(a,b);
    }
    catch(MyException &e)
    {
????????cout?<<?e.what() <<?endl;
    }
????cout?<<?a?<<?b?<<?endl;
    return 0;
}

文章来源:https://blog.csdn.net/m0_74937538/article/details/135422407
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。