首页 > 编程语言 >C++:异常

C++:异常

时间:2024-09-04 20:54:30浏览次数:12  
标签:double 捕获 C++ 报错 catch 异常 throw

文章目录


什么是异常?

异常: 

异常这个概念可能会有一些陌生,但是str.at(i)我们并不陌生,当i值越界时就会产生一个异常语句:terminate called after throwing an instance of 'std::out_of_range'
   what():  basic_string::at: __n (which is 7) >= this->size() (which is 5),此时会终止程序,让程序运行更安全。异常处理机制允许程序在发生错误时保持控制流,能够清理资源并继续执行或安全地终止程序。

报错:

相比于异常而言,报错则是我们的老朋友了,还记得恐怖的“段错误”带来的恐惧吗?报错通常指的是程序在编译时或运行时遇到的严重问题,可能导致程序崩溃或无法继续执行。报错可以是语法错误、链接错误或运行时错误(如访问非法内存)。

总结来说,异常是可以被捕获和处理的错误情况,而报错通常是更严重的问题,可能导致程序无法继续运行。异常处理提供了一种优雅的方式来管理错误,而报错则需要在代码编写和调试阶段加以注意。


 

一、异常的处理方式

1.抛出异常

关键字:throw

可以throw关键字在代码块的任何位置抛出异常,通常在达到一些预设的逻辑问题时进行抛出,异常对象在抛出后如果没有捕获,会逐层向上传递,直到主函数。如果主函数中也没有正确捕获异常对象,则程序运行终止。

#include <iostream>

using namespace std;

double divide(double a,double b)
{
    if(b == 0)
    {
        throw ;//当b为零时,抛出异常
    }
    return a/b;
}

int main()
{
    cout << divide(1,0) << endl;

    return 0;
}

此时代码运行后会出现:terminate called without an active exception 提示运行出现异常,程序终止。

2.捕获异常

使用try-catch块捕获异常。

try块负责执行可能抛出异常的代码,catch块用来匹配异常类型:

  • 如果catch不能正确匹配类型,相当于没有捕获成功,异常对象继续向上传递。
  • 如果catch能正确匹配类型,捕获成功,此时直接跳转到catch块执行代码,catch块执行完毕后try-catch块结束,执行外层的代码。
    #include <iostream>
    
    using namespace std;
    
    double divide(double a,double b)
    {
        if(b == 0)
        {
            throw "除数不能为0";
        }
        return a/b;
    }
    
    int main()
    {
        // 捕获成功
        try
        {
            cout << divide(1,0) << endl;
        }catch(const char* e)    //捕获的异常的类型
        {
            cout << "捕获成功!" << e << endl;
        }
    
        return 0;
    }
    

此时会打印出捕获的异常:“除数不能为零”(注意:这是const char*类型)。程序终止。 

二、标准异常

使用这些标准异常需要引入头文件 #include <stdexcept>

三、自定义异常

实际开发中由于C++异常机制不完善,如果要使用异常通常需要扩展标准异常家族,此时可以自定义异常类,继承标准异常类型。

#include <iostream>
#include <stdexcept> // 标准异常

using namespace std;

/**
 * @brief The ZeroException class
 * 自定义异常类继承标准异常类
 */
class ZeroException:public exception
{
public:
    // throw()表示异常规格说明
    // 告诉编译器此函数不会抛出异常
    const char* what() const throw()  //异常函数
    {
        return "除数不能为0";
    }
};


double divide(double a,double b)
{
    if(b == 0)
    {
        throw ZeroException();
    }
    return a/b;
}

int main()
{
    // 捕获成功
    try
    {
        cout << divide(1,0) << endl;
    }catch(const ZeroException& e)
    {
        cout << "捕获成功!" << e.what() << endl;
    }

    cout << "主函数执行完毕" << endl;
    return 0;
}

此时当产生异常时,捕获的就是自己定义的异常类型。

标签:double,捕获,C++,报错,catch,异常,throw
From: https://blog.csdn.net/z200202271510/article/details/141902507

相关文章

  • windows C++ 并行编程-并发和UWP(三)
    控制执行线程Windows运行时使用COM线程模型。在此模型中,根据对象处理其同步的方式,对象被托管在不同的单元中。线程安全对象托管在多线程单元(MTA)中。必须通过单个线程访问的对象托管在单线程单元(STA)中。在具有UI的应用程序中,ASTA(应用程序STA)线程负责发送窗......
  • windows C++ 并行编程-并发和UWP(一)
    本文介绍当在通用Windows运行时(UWP)应用中使用任务类生成基于Windows线程池的异步操作时要谨记的一些要点。异步编程的使用是Windows运行时应用模型中的关键组成部分,因为它能使应用保持对用户输入的响应。可以启动长期运行的任务,而不必阻止UI线程,并且可以在以后接......
  • linux C++基于共享内存的同步机制
    无缘进程间同步,本来打算使用有名信号量进行同步,但是有名信号量的初始化会受进程启动顺序影响,故使用共享内存进行封装,封装后的使用方法类似二值信号量,代码如下:1#include<sys/ipc.h>//ipc:inter-processcommunication进程通信2#include<sys/shm.h>//shm:shareme......
  • 坐牢第三十五天(c++)
    一.作业1.使用模版类自定义栈代码:#include<iostream>usingnamespacestd;template<typenameT>//封装一个栈classstcak{private:T*data;//intmax_size;//最大容量inttop;//下标public://无参构造函数stcak();//......
  • 2024.9.4C++作业
    #include<iostream>#include<string>usingnamespacestd;classHuman{public:Human(){name="Unknown";age=0;}Human(stringn,inta){name=n;age=a;}~Hu......
  • 2024.9.3C++
    自行实现Mystring类#include<iostream>#include<cstring>usingnamespacestd;classmystring{public:mystring(){len=0;str=nullptr;}mystring(constchar*s){len=strlen(s);str=ne......
  • 2024.9.2C++作业
    自行实现一个Mystring类#include<iostream>#include<cstring>usingnamespacestd;classmystring{public:mystring(){len=0;str=nullptr;}mystring(constchar*s){len=strlen(s);str=n......
  • C++基础之杂项
    目录思维导图:学习内容:1. Lambda表达式1.1基本概念1.2定义格式1.3常用情况二、异常处理2.1什么是异常处理2.2何时使用异常处理2.3异常处理的格式2.4异常实例2.5构造和析构中的异常 2.6系统提供异常类 三、C++中文件操作3.1文件流对象的介绍3.2关......
  • Codeforces Round 971 (Div. 4) ABCD题详细题解(C++,Python)
    前言:    本文为CodeforcesRound971(Div.4)ABCD题的题解,包含C++,Python语言描述,觉得有帮助或者写的不错可以点个赞    比赛打了没一半突然unrated了就不是很想继续写了,早起写个题解    (之前的div3也没复盘,哎真菜)目录题A:题目大意和解题......
  • AtCoder Beginner Contest 369 题ABCD详细题解--包含解题思路和两种语言(C++,Python)
    前言:    本文为AtCoderBeginnerContest369题ABCD详细题解,包括题目大意,详细的解题思路和两种语言描述,觉的有帮助或者写的不错可以点个赞几天前的比赛拖的有点久了比赛题目连接:Tasks-AtCoderBeginnerContest369目录题A:题目大意和解题思路:代码(C++):......