异常时程序在执行期间产生的问题。C++异常是指在程序运行时发生的特殊情况。比如string::at函数下标越界等。
异常提供了一种转移程序控制权的方式。
一旦程序出现异常没有经过处理,就会造成程序运行崩溃。
处理异常的方式有:抛出异常(throw)和捕获异常(try?-?catch)
可以使用throw语句在代码块中的任何地方抛出异常。
throw语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出异常的类型。
抛出的异常是抛出到函数调用的上一级。
#include?<iostream>
using namespace std;
//?除法
double division(double?a,double?b)
{
if(b?== 0)
{
string text("除数等于0!");
throw?text;//抛出一个异常:异常为除数为0
}
return?a/b;
}
double input()
{
????cout?<< "input?开始执行" <<?endl;
double?a;
double?b;
????cout?<< "请输入两个浮点型:" <<?endl;
????cin?>>?a?>>?b;
double?c?= division(a,b); //?1?text对象在这(无人处理)
????cout?<< "input?执行结束" <<?endl;
return?c;
}
int main()
{
????cout?<< "程序开始执行" <<?endl;
????cout?<< input() <<?endl; //?2?text对象又到这了(还是无人处理)
????cout?<< "程序执行结束" <<?endl;
return 0;
}
如果有一个try代码块抛出一个异常,捕获异常使用catch代码块。
#include?<iostream>
using namespace std;
//?除法
double division(double?a,double?b)
{
if(b?== 0)
{
string text("除数等于0!");
throw?text; //?抛出一个异常
}
return?a/b;
}
double input()
{
????cout?<< "input?开始执行" <<?endl;
double?a;
double?b;
????cout?<< "请输入两个浮点型:" <<?endl;
????cin?>>?a?>>?b;
double?c?= 0;
try //?尝试抛出一个异常
{
????????c?= division(a,b);
}
catch(string &e) //?尝试捕获一个异常(类型跟抛出的异常类型不符合,会出现捕获不到的情况)
//catch(...)//捕获所有异常
{
//?验证异常类型对象
????????cout?<<?e?<<?endl;
//?补救措施
return 0;
}
????cout?<< "input?执行结束" <<?endl;
return?c;
}
int main()
{
????cout?<< "程序开始执行" <<?endl;
????cout?<< input() <<?endl; //?2?text对象又到这了(还是无人处理)
????cout?<< "程序执行结束" <<?endl;
return 0;
}
上述代码中可能会出现的几种情况:
#include<stdexcept>头文件
C++给常见的异常类型进行了定义和分类,引入#include<stdexcept>头文件后可以使用。
这个体系还是太薄弱了,因此可以对其进行拓展。
自定义一个类型,继承自某个异常类型即可。
一个标注捕获的例子:
#include?<iostream>
#include?<stdexcept>
using namespace std;
int main()
{
string?s?= "helloworld";
try
{
????????cout?<<?s.at(100) <<?endl;//异常,下标越界
}
catch(out_of_range &e)
{
//?输出错误信息
????????cout?<<?e.what() <<?endl;
//?补救措施
????????cout?<< -1 <<?endl;
}
return 0;
}
一个抛出自定义异常的例子:
#include?<iostream>
#include?<stdexcept>
using namespace std;
//?继承于exception
class MyException:public?exception
{
public:
//?覆盖what函数
//?throw():异常规格说明
//?表示此函数不会出现任何异常的抛出
const char* what() const throw()
{
return "自定义异常类型" ;
}
};
void show(string?a,string?b)
{
if(a?== "#" ||?b?== "#")
{
throw MyException();
}
????cout?<<?a?<<?b?<<?endl;
}
int main()
{
????cout?<< "请输入两个字符串" <<?endl;
string?a;
string?b;
????cin?>>?a?>>?b;
try
{
show(a,b);
}
catch(MyException &e)
{
????????cout?<<?e.what() <<?endl;
}
????cout?<<?a?<<?b?<<?endl;
return 0;
}