系列文章目录
前言
异常处理在编写c++程序中更好的发现错误;
一、基本的异常处理
-
异常处理机制:暂缓问题处理,不在当前函数中处理,在他调用者中处理
-
什么是异常,任何东西都可以认为是异常,错误只是异常的一种
-
异常一旦被抛出,不做处理,如果引发错误,会调用默认abort终止程序
-
捕获和处理异常
-
throw 抛出异常,(可以理解为返回值,值是任何类型都可以,使我们处理异常一个参照)
-
try(检查,捕获)和catch(处理异常)
-
int fiand(int y, int i)
{
if (i == 0)
throw 10;//抛出异常
return y / i;
}
int main()
{
try {
fiand(12, 0);//注意这里如果有异常抛出就会直接跳转到catch处不会再往下继续执行
cout<<"无异常"<<endl;//如果上一段处有异常被抛出此段就不会被执行
}//检查与捕获异常
catch (int u) //这里是一个隐藏的传参操作//根据异常的类型来处理异常
{
cout << u<<endl;
}
catch(const char*)
{
cout<<u<<endl;
}
return 0;
}
不存在异常的描述
-
throw () //起标识作用表示这个函数不存在异常的抛出就是throw,如果有也不会报错
-
noexcept //与throw基本相同但如果再有noexcept标识的函数中出现throw就会报错导致编译不通过;
使用方法:
void A(int y) throw()
{
cout<<"不存在异常"<<endl;
//即使出现throw也不会报错
}
void B(int y) noexcept
{
cout << "新的描述:不存在抛出异常" << endl;
//throw 0; 编译不过,一旦说明没有异常操作,就不能抛出
}
二、自定义异常类
一般为了更好的观察记录异常一般会自定义一个异常类;这个类专门用来当作throw抛出的异常,这样可以记录下更多的异常信息并且比单纯的字符串与数字更好处理;
例子:
#include<string>
#include <iostream>
using namespace std;
class Error//专门传递错误信息
{
public:
Error(const char*p):str(p){}
string c_str()//接口函数
{
return str;
}
protected:
string str;
};
int fiand(int y, int i)
{
if (i == 0)
throw Error("除数不能为零");
return y / i;
}
int main()
{
try { fiand(12, 0); }
catch (int ) {
cout <<"错误";
}
catch (Error i)//使用了隐藏传参操作
{
cout << i.c_str();
}
return 0;
}
三、标注库中的异常处理
标准库中是使用了继承来逐一分析问题的如图所示
我们也可以通过继承标准库中的类容来创建自己的异常类这样就可以使用标准中已经定义好的函数;但是这样作要对标准库足够熟悉;