throw
抛出的这个异常对象可以是一个常量,对象,常量字符串,右值临时对象也可以。
throw关键字抛出异常是层层抛出,如果每一层都没有对这个异常进行处理,那么最终会在main函数中被抛出。
如果main函数也没有进行处理,程序将自动终止。
try...catch...
try
{
//try语句块,放有可能出现异常函数。
//用来捕获有可能抛出的异常。
}catch(异常对象表达式){
//catch语句块中,用来处理捕获的导常。
}catch (exception e) { //捕获其他所有异常
//catch语句块中,用来处理捕获的导常。
}
综合练习
可自定义错误类:
#include <iostream>
using namespace std;
//可自定义错误
class Error
{
private:
string err;
public:
Error(string err)
{
this->err = err;
}
string what()
{
return this->err;
}
};
自定义普通函数用于抛出异常:
float my_div(int a, int b)
{
Error *e1 = new Error("??"); //用于抛出,触发"其他错误"
if(b == 0)
{
throw -1; //可抛出常量
}
if( b == -10 )
{
throw "除数为-10"; //可抛出字符串
}
if (b == -5)
{
throw Error("除数不可为-5"); //可抛出临时对象
}
if (b == -20)
{
throw e1; //抛出对象
}
return a / b;
}
float my_add(int a, int b)
{
return a + b + my_div(a,b);
}
主函数验证:
int main()
{
try {
cout << my_add(10,-20) << endl;
}catch (int e){ //接收int型错误
cout << "除数是0" << endl;
} catch (Error& e) { //接收 临时对象型 错误
cout << e.what() << endl;
} catch (const char* e){ //接收字符串错误
cout << e << endl;
}catch (exception){ //若没有设置异常相对应的接收,此语句可在异常抛出后自动提示,与catch(...)同用则无效
}catch (...){ //接收其他所有错误(我这里接收类对象e1测试)
cout << "其他错误" << endl;
}
cout << "程序继续" << endl;
return 0;
}
运行结果:
my_add(10, 0)
my_add(10, -10)
my_add(10, -5)
my_add(10, -20)