C/C++中异常处理详解及其作用介绍

 更新时间:2021年09月02日 15:32:21   作者:我是小白呀  
这篇文章主要介绍了C/C++中异常处理详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

概述

作为一名专业写 Bug, 编程一天改 bug 一周的程序媛. 学会异常处理是非常重要的. 我们不仅要考虑没有错误的理想情况, 更要考虑存在错误时的情况.

在这里插入图片描述

Debug 可以帮助我们尽快发现错误, 消除错误. 错误类别:

  • 语法错误
  • 运行错误
  • 逻辑错误

异常处理

设计程序时, 事先分析程序运行时可能出现的各种意外情况, 定制出相应的处理方法. 异常处理指对运行时出现的差错以及其他例外情况的处理.

在这里插入图片描述

没有异常处理程序时, 运行出现异常, 程序只能终止运行. 设置了异常处理机制, 运行出现异常, 程序的流程就转到异常处理代码段处理. 用户可以指定进行任何的处理.

举一个除数为 0 的例子:

#include <iostream>
using namespace std;

template <typename T>
T Div(T x, T y);

int main() {
    // 声明变量
    int x, y;
    double x1, y1;

    // 赋值
    cin >> x >> y;
    cin >> x1 >> y1;

    // 输出商
    cout << x << "/" << y << "=" << Div(x, y) << endl;
    cout << x1 << "/" << y1 << "=" << Div(x1, y1) << endl;

    return 0;
}

template <typename T>
T Div(T x, T y) {
    return x / y;
}

输出结果:

在这里插入图片描述

众所周知分母不能为 0, 所以在这里我们可以看见程序终止运行了.

异常处理机制

我们把程序运行时的错误统称为异常. 对异常的处理统称为异常处理. C++ 中所提供的异常处理机制结构清晰, 在一定程度上可以保证程序的健壮性.

在这里插入图片描述

C++ 中处理异常的过程:

  • 在执行程序发生异常, 可以不在本函数中处理. 而是抛出一个错误信息, 把它传递给上一级的函数来解决. 上一级解决不了, 再传给其上一级, 由其上一级处理.
  • 如此主机上传, 直到最高一级还无法处理的话, 运行系统会调用 abort 终止程序.

格式:

try {
    被检查语句
    throw 异常
}
catch(异常类型1) {
    进行异常处理的语句1
}
catch(异常类型2) {
    进行异常处理的语句2
}
  • 把需要检查的语句放在 try 模块中
  • try 和 catch 作为一个整体出现
  • try 和 catch 块中必须用话括号括起来, 即使花括号内只有一个语句
  • 检查语句发生错误, throw 抛出异常, 发出错误信息
  • 由 catch 来捕捉异常信息, 并加以处理
  • 一个 try-catch 结构中只能有一个 try 块, 但却可以有多个 catch 块, 以便匹配不同的异常信息
  • 一般 throw 抛出的异常要和 catch 所捕获的异常类型所匹配
  • catch 后面的圆括号中, 一般只写异常信息的类型名, 如 catch (double)
  • 如果 throw 抛出异常信息找不到与之匹配的 catch 块, 那么系统就会调用一个系统函数 terminate, 使程序终止运行

函数声明指定异常

我们可以在函数声明中指定异常情况, 这样我们在看程序时能够知道所用的函数是否会抛出异常信息以及异常信息可能的类型. C++ 允许在声明函数时列出可能抛出的异常类型.

在这里插入图片描述

声明一个不能抛出异常的函数:

double triangle(double,double,double) throw();

声明一个能抛出异常的函数:

int triangle(int a, int b, int c) throw(runtime_error);

注: 要指定异常类型, 必须在声明和定义时都指定, 且类型相同.

练习

案例一

防止除数为 0:

#include <iostream>
using namespace std;

template <typename T>
T Div(T x, T y);

int main() {
    // 声明变量
    int x, y;
    double x1, y1;

    // 赋值
    cout << "Please enter two int:\n";
    cin >> x >> y;
    cout << "Please enter two double:\n";
    cin >> x1 >> y1;

    try {
        // 被检查的语句
        cout << x << "/" << y << "=" << Div(x, y) << endl;
        cout << x1 << "/" << y1 << "=" << Div(x1, y1) << endl;
    } catch (int) {  // 异常类型
        cerr << "除数为 0, 计算错误!" << endl;  // 异常处理数据
    } catch (double ) {  // 异常类型
        cerr << "除数为 0.0, 计算错误!" << endl;  // 异常处理数据
    }

    return 0;
}

template <typename T>
T Div(T x, T y) {
    if (y == 0){
        throw y;  // 抛出异常
    }

    return x / y;
}

输出结果:

Please enter two int:
1 2
Please enter two double:
2 0.0
除数为 0.0, 计算错误!
1/2=0
2/0=

案例二

求三角形周长, 防止三边小于零或组不成三角形.

#include <iostream>

using namespace std;

int triangle(int a, int b, int c);

int main() {
    // 声明变量
    int a, b, c;

    // 赋值
    cout << "Please enter the three side of the triangle:\n";
    cin >> a >> b >> c;

    try {
        // 被检查的语句
        cout << "length of the triangle: " << triangle(a, b, c) << endl;
    } catch (const runtime_error &error) {  // 异常类型
        cerr << error.what() << endl;  // 异常处理数据
    }

    return 0;
}

int triangle(int a, int b, int c) {
    if (a <= 0 || b <= 0 || c <= 0) {
        throw runtime_error("The sides of the triangle cannot be less than or equal to zero");
    } else if (a + b <= c || a + c <= b || b + c <= a) {
        throw runtime_error("The lengths of three sides can't form triangle");
    }
    return a + b + c;
}

输出结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

到此这篇关于C/C++中异常处理详解及其作用介绍的文章就介绍到这了,更多相关C++异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入分析C++中类的大小

    深入分析C++中类的大小

    本篇文章深入分析了C++中类的大小问题。需要的朋友参考下
    2013-05-05
  • 用代码和UML图化解设计模式之桥接模式的深入分析

    用代码和UML图化解设计模式之桥接模式的深入分析

    本篇文章是对桥接模式进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++实现关系与关系矩阵的代码详解

    C++实现关系与关系矩阵的代码详解

    这篇文章主要介绍了C++实现关系与关系矩阵,功能实现包括关系的矩阵表示,关系的性质判断及关系的合成,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C++命名空间using namespace std是什么意思

    C++命名空间using namespace std是什么意思

    namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,下面这篇文章主要给大家介绍了关于C++命名空间using namespace std是什么意思的相关资料,需要的朋友可以参考下
    2023-01-01
  • C++实现打印两个有序链表公共部分的方法

    C++实现打印两个有序链表公共部分的方法

    这篇文章主要介绍了C++实现打印两个有序链表公共部分的方法,涉及C++针对有序链表的简单遍历、比较相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • C++Node类Cartographer开始轨迹的处理深度详解

    C++Node类Cartographer开始轨迹的处理深度详解

    这篇文章主要介绍了C++Node类Cartographer开始轨迹的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • C语言中的数据类型强制转换

    C语言中的数据类型强制转换

    这篇文章主要介绍了C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • C++常见异常处理原理及代码示例解析

    C++常见异常处理原理及代码示例解析

    这篇文章主要介绍了C++常见异常处理原理及代码示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • c++打印封装每次打印前面加上时间戳问题

    c++打印封装每次打印前面加上时间戳问题

    这篇文章主要介绍了c++打印封装每次打印前面加上时间戳问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 深入分析C++模板特化与偏特化

    深入分析C++模板特化与偏特化

    这篇文章主要介绍了C++模板特化与偏特化的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08

最新评论