c++std::except类

一、先看一段代码感受一下

#include<stdexcept>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
	vector<int>myvector(10);
	try{
		cout<<myvector.at(20);
	}catch(const out_of_range& oor)
	{
    std::cerr << "Out of Range error: " << oor.what() << '\n';
    }
	
	
	return 0;
}

然后这是跑出来的结果:

1.1 分析一下上面的代码模式,探索这个类的使用方法

try{
	
	
}catch(const out_Of_range &oor){
	cerr<<oor.what();
}

先把关键的内容写下来。try里面就是要跑的可能存在问题的一段代码,这段代码存在问题时,不会直接终止程序,而是会将自身的问题发送给catch去捕获,这里捕获了一个out_of_range的错误,然后一旦捕获,就会运行catch后括起来的代码,这里cerr是标准错误输出,这里oor.what()调用就是看oor到底是什么错误

1.2 还可以通过throw抛出错误

void my_stdexcept(int judge)
{
    if (judge==0){
        throw std::invalid_argument("invalid!");
    }
    else{
       
    }
}

很明显,throw英文就是‘抛出’,‘抛出’对应的是什么?是‘捕获’catch,所以你可以在throw后头加上catch去捕获错误

1.3 完整的逻辑机制

#include <iostream>
#include <stdexcept>

int main() {
    try {
        // 可能会抛出异常的代码
        //这里既可以主动throw,也可以是代码自身直接出问题的抛出错误
        throw std::runtime_error("发生了一个错误");
    } catch (const std::runtime_error& e) {
        // 捕获并处理 runtime_error 类型的异常
        std::cerr << "捕获到异常: " << e.what() << std::endl;
    } catch (...) {
        // 可以捕获所有类型的异常
        std::cerr << "捕获到未知异常" << std::endl;
    }
    return 0;
}

明确两点:

1、try后面的抛出错误可以是主动也可以是被动的,解释一下,‘主动’就是最直接throw抛出某个错误这里可以是自定义的错误,也可以是标准的error(推荐),而’被动‘的就是代码跑了之后自动运行过程中反馈的错误自动抛出,没有明写出来具体的错误类型,当代码量大的时候存在不可知性,可能会抛出众多错误类型中的一个(这个可以参照上面vector越界的情况,但是举例的这种情况是具有可知性的,因为代码逻辑太简单了)。

2.catch可以写多个,因为我们在跑代码的时候针对‘被动’的情况可能比较多,对try后面比较复杂的代码块,我们不能提前知道里面到底要抛出什么样的错误,此时我们就要用多个catch(不同类型的错误类型)去捕获,以期不遗漏抛出的错误。catch(...)是catch的默认执行语句,就是你设置的其他catch()都没捕获到错误,那么此时就会执行这个语句。

还在努力学习,文章不足之处多多指正,我会不断完善,持续学习,文章不定期完善更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值