🏆 个人主页:🎈 @太阳哥哥 🎈
🎁 本文收录专栏:🎈C++学习之路 🎈
🛒 其他专栏:🎈 ARM学习之路 🎈
📝 学习格言:路漫漫其修远兮,吾将上下而求索
💡 欢迎点赞、关注、收藏( •̀ ω •́ )✧ 一起努力,一起学习!
目录
1、异常处理
1.1、异常
异常:是c++中容错机制,是处理错误系统,将问题和处理分离开来。
1.2、异常处理
异常处理:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一方面,库的用户知道怎样处理这些错误,但却无法检查它们何时发生(如果能检测,就可以再用户的代码里处理了,不用留给库去发现)。提供异常的基本目的就是为了处理上面的问题。
基本思想是:让一个函数在发现了自己无法处理的错误时抛出(throw)一个异常,然后它的(直接或者间接)调用者能够处理这个问题。
异常关键字:throw、try、catch
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