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语言实现简单计算器程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Linux下动静态库的打包与使用指南(C/C++)

    Linux下动静态库的打包与使用指南(C/C++)

    c++是面向对象的编程语言,比较方便实现某些第三方库,比如翻译其他面向对象语言的代码,比c语言要方便的多,下面这篇文章主要给大家介绍了关于Linux下C/C++动静态库的打包与使用的相关资料,需要的朋友可以参考下
    2023-02-02
  • C语言中时间戳转换成时间字符串的方法

    C语言中时间戳转换成时间字符串的方法

    在PE格式里有个字段是文件的创建时间戳,我想把转成字符串,今天小编给大家分享一段代码,可以比较直观的看出,需要的的朋友参考下
    2017-02-02
  • C++之如何设置字体颜色

    C++之如何设置字体颜色

    很多C++的初学者发现,控制台的颜色永远是黑白的,这未免太单调了,怎么才能使字体像那些软件一样呈彩色呢?现在,我们就将学习C++ 设置字体颜色的方法
    2023-08-08
  • Cocos2d-x中获取系统时间和随机数实例

    Cocos2d-x中获取系统时间和随机数实例

    这篇文章主要介绍了Cocos2d-x中获取系统时间和随机数实例,本文代码含有大量注释来讲解获取系统时间和随机数的方法,需要的朋友可以参考下
    2014-09-09
  • Qt 智能指针QScopedPoint用法小结

    Qt 智能指针QScopedPoint用法小结

    智能指针是C++11引入的一种指针封装类型,用于自动管理动态分配的内存,本文主要介绍了Qt 智能指针QScopedPoint用法小结,感兴趣的可以了解一下
    2024-01-01
  • 基于C++中常见编译错误的总结详解

    基于C++中常见编译错误的总结详解

    本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言一级指针二级指针和三级指针区别及使用详解

    C语言一级指针二级指针和三级指针区别及使用详解

    这篇文章主要为大家介绍了C语言一级指针二级指针和三级指针,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • C语言实现扫雷游戏详解(附源码)

    C语言实现扫雷游戏详解(附源码)

    大家好,本篇文章主要讲的是C语言实现扫雷游戏详解(附源码),感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 用C编写一个送给女朋友的情人节小程序 可爱!

    用C编写一个送给女朋友的情人节小程序 可爱!

    非常可爱的情人节小程序!文章为大家分享了用C编写一个送给女朋友的小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论