头文件#include<exception>
一、异常处理机制:暂缓问题处理,不在当前函数处理,在调用者中处理
1.任何东西都可以是异常,错误只是异常的一种
2.异常一旦被抛出,不作处理,如果引发异常,会调用默认的abort终止程序
二、捕获和抛出异常
throw抛出异常(可以理解为返回一个值,可以是任何类型,作为处理异常的一个参照)
try(检查、捕获)和catch(处理异常)
(try和catch) 必须一起出现,并且{}不能省略
try
{ //需要检查的异常代码}
catch(类型或表达式) //理解为switch中的case
{ //根据抛出的数据类型决定怎么去处理}
一个try可以对应多个catch()
try和catch()是一条语句 和 if与else if 执行机制一样 最终只执行一条语句
一旦try里面发生异常就会直接跳转到对应catch()
删减符 ... 使用删减符可捕捉任何异常
catch(...)//捕捉任何异常
异常的描述
注意其中的字符串被解析为const char*类型,使用string类型要手动转换
int divisor(int a, int b)
{
if (b == 0)
//throw(0);//0的情况被视作异常 抛出异常
throw "除数不能为0";//被解析为char*类型
if (b == 1)
throw string("除数不能是1");//转为string类型
return a / b;
}
int main()
{
try
{
divisor(1, 0);
}
catch (const char* str)//str="除数不能为0"
{
cout << str << endl;
}
return 0;
}
不存在异常的描述
void print()throw()//标识作用 或者用noexcept()
{
cout << "当前函数不存在异常操作";
//若写throw(),进行抛出操作,编译出错
}
一、标准库中的异常设计
exception类 内部的设计方式在出现新的情况时只需要新增代码不需要删减代码
以下为设计方式的演示(标准库实际还有另一个参数 用来标识错误的编号,对应的错误有对应的编号)
class Exception
{
public:
Exception(const char* ptr = "UNKNOW") :ptr(const_cast<char*>(ptr)) {}
virtual const char* what()const
{
return ptr;
}//程序实际还有另一个参数 用来标识错误的编号
protected:
char* ptr;
};//子类直接继承父类,后续出现错误调用父类的方法
class Bad_alloc :public Exception
{
public:
Bad_alloc(const char* _Message = "bad exception") :Exception(_Message) {}
};
int main()
{
try
{
while(1)
int* p = new int[1024 * 1024];
}
catch (bad_alloc& object)
{
cout << object.what() << endl;
}
return 0;
}
二、自己处理异常的方式
(1)自定义异常类 自己写的异常处理
class Error
{
public:
Error(const char* str = "未知错误") :str(const_cast<char*>(str)) {}
const char* what()const
{
return str.c_str();
}
protected:
string str;
};
void insertArray(int array[], int* curNum, int posData,int maxLength)
{
if (*curNum >= maxLength)
{
throw Error("数组下标溢出");
}
array[*curNum] = posData;
(*curNum)++;
}
void testOne()//将一类异常写在函数内,在多次出现时直接调用相应函数
{
try
{
int array[3] = { 0 };
int curNum = 0;
for (int i = 0;i < 4;i++)
{
insertArray(array, &curNum, 1, 3);
}
}
catch (Error str)
{
cout << str.what();
}
}
int main()
{
testOne();
return 0;
}
(2)继承标准库中的异常类 通过重写what方法
//直接继承标准库中exception类 然后重写
class myException :public exception
{
public://继承标准库 新添自己的情况即可
myException(string str) :exception(str.c_str()) {}
};