一、先看一段代码感受一下
#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()都没捕获到错误,那么此时就会执行这个语句。
还在努力学习,文章不足之处多多指正,我会不断完善,持续学习,文章不定期完善更新