【c++】 异常处理

6d63dc5dd3994f75ae53a20768cc10f6.gif

🏆 个人主页:🎈 @太阳哥哥 🎈

🎁 本文收录专栏:🎈C++学习之路 🎈

🛒 其他专栏:🎈 ARM学习之路 🎈

📝 学习格言:路漫漫其修远兮,吾将上下而求索

💡 欢迎点赞、关注、收藏( •̀ ω •́ )✧   一起努力,一起学习!

目录

1、异常处理

1.1、异常

1.2、异常处理

2、标准异常

3、自定义异常类


1、异常处理

1.1、异常

        异常:是c++中容错机制,是处理错误系统,将问题和处理分离开来。

1.2、异常处理

        异常处理:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一方面,库的用户知道怎样处理这些错误,但却无法检查它们何时发生(如果能检测,就可以再用户的代码里处理了,不用留给库去发现)。提供异常的基本目的就是为了处理上面的问题。

        基本思想是:让一个函数在发现了自己无法处理的错误时抛出(throw)一个异常,然后它的(直接或者间接)调用者能够处理这个问题。

        异常关键字:throwtrycatch

        throw: 抛出异常

        格式:throw 抛出异常类型数据;

        try: 检测代码是否产生了异常

        格式:

        try
        {
            //可以产生的异常的代码块
        }

        catch:捕获异常 格式:

        catch(异常的类型)
        {
            //处理产生的异常
        )

        程序示例;

#include <iostream>
#include <string>
using namespace std;
//帮助识别问题,并报错;
class Father 
{
public:
    int div(int a, int b)
    {
        if (b == 0)//抛出异常的条件
        {
            throw 0;//抛出异常
        }
        else
        {
            return a / b;
        }
    }
};
​
int main()
{
    int a, b;
    cin >> a >> b;
    Father q;
    try //检测异常
    {
        q.div(a,b);
    }
    catch (int)//捕获异常类型 int
    {
        cout << "捕获到异常,分母不能为 0" << endl;//描述异常内容
    }
    catch (...)//捕获所有类型异常
    {
        cout << "捕获所有异常" << endl;
    }
    cout << q.div(a,b) << endl;//没有异常,正常输出内容
    return 0;
}

注:

        (1)如果确定异常已经产生,但是用户没有去写捕获该异常的catch,那么程序的外层继续捕获该异常,如果还是没有捕获到,那么最后就调用windows的terminate来终止程序 。

        (2)try模块后面必须紧跟着一个catch块或者是多个catch块 。

        (3)产生的异常首先是匹配try后紧跟着的第一个catch块,如果没有匹配,继续往下一个catch进行匹配,如果还是没有捕获到,那么最后就调用windows的terminate来终止程序 。

        (4)catch(...)它是用于捕获所有异常 。

        (5)try...catch块可以发生嵌套。

2、标准异常

        c++标准库一些类代表异常,由exception 类派生而来,如:bad_typeid、bad_cast、bad_alloc、ios_base::failure、out_of_range 都是 exception 类的派生类。

  •         std::exception 该异常是所有标准 C++ 异常的父类。
  •         std::bad_alloc 该异常可以通过 new 抛出。
  •         std::bad_cast 该异常可以通过 dynamic_cast 抛出。
  •         std::bad_exception 这在处理 C++ 程序中无法预期的异常时非常有用。
  •         std::bad_typeid 该异常可以通过 typeid 抛出。 std::logic_error 理论上可以通过读取代码来检测到的异常。
  •          std::domain_error 当使用了一个无效的数学域时,会抛出该异常。
  •          std::invalid_argument 当使用了无效的参数时,会抛出该异常。
  •         std::length_error 当创建了太长的 std::string 时,会抛出该异常。
  •         std::out_of_range 参数超出有效范围 std::runtime_error 理论上不可以通过读取代码来检测到的异常。
  •         std::overflow_error 当发生数学上溢时,会抛出该异常。
  •         std::range_error 当尝试存储超出范围的值时,会抛出该异常。
  •         std::underflow_error 当发生数学下溢时,会抛出该异常。

        C++ 程序在碰到某些异常时,即使程序中没有写 throw 语句,也会自动拋出上述异常类的对象。

3、自定义异常类

        需要继承C++提供的所有异常的基类exception,可以在自定义的异常类重写what()方法,用于查看产生的异常的类型。

        格式:

    //class  自定义的异常 :public  exception
    {
        //自定义异常类体
    }

        以下程序自定义异常类,用于提示字符串的错误。

        程序示例:

#include <iostream>
#include <string>
using namespace std;
//用以识别字符串错误;
class MyException :public exception
{
public:
    const char* str;
    MyException(const char* obj)
    {
        str = obj;
    }
    const char* what()
    {
        return str;
    }
};
int function(int a, int b)
{
    if (b == 0)
    {
        throw MyException("分母不能为 0");
    }
    else 
    {
        return a / b;
    }
}
​
int main()
{
    int a, b;
    cin >> a >> b;
​
    try //检测异常
    {
        function(a, b);
    }
    /*catch (int)//捕获异常类型 int
    {
        cout << "捕获到异常,分母不能为 0" << endl;//描述异常内容
    }*/
    catch (MyException&e)
    {
        cout << "捕获到异常 " <<e.what() << endl;//描述异常内容
    }
​
    cout << function(a,b) << endl;//没有异常,正常输出内容
    return 0;
}

程序执行结果:

6
0
捕获到异常 分母不能为 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫漫长夜想学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值