C++-异常处理

1、概念

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

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

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

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

2、抛出异常-throw语句

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

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

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

#include <iostream>

using namespace std;

// 除法
double division(double a,double b)
{
      
    if(== 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(== 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(== "#" || 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;
}

相关推荐

  1. C/C++ - 异常处理

    2024-01-06 18:46:04       27 阅读
  2. C++ 异常处理

    2024-01-06 18:46:04       24 阅读
  3. C++ 异常处理

    2024-01-06 18:46:04       19 阅读
  4. C++异常处理

    2024-01-06 18:46:04       21 阅读
  5. C++:异常处理

    2024-01-06 18:46:04       14 阅读
  6. C++ 异常处理

    2024-01-06 18:46:04       11 阅读
  7. C#基础之异常处理

    2024-01-06 18:46:04       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-06 18:46:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-06 18:46:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-06 18:46:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-06 18:46:04       20 阅读

热门阅读

  1. 【Python】关于Python的列表推导式(List Comprehensions)

    2024-01-06 18:46:04       39 阅读
  2. MySQL 8.0中新增的功能(二)

    2024-01-06 18:46:04       33 阅读
  3. 96 双指针解旋转链表

    2024-01-06 18:46:04       39 阅读
  4. WebSocket

    WebSocket

    2024-01-06 18:46:04      42 阅读
  5. 提供小红书笔记详情API的使用说明

    2024-01-06 18:46:04       53 阅读
  6. (C语言)指针的进阶

    2024-01-06 18:46:04       47 阅读
  7. golang 的那些花样

    2024-01-06 18:46:04       44 阅读
  8. 并发编程:线程同步基础:7、StampedLock DEMO

    2024-01-06 18:46:04       39 阅读