1、概念
异常时程序在执行期间产生的问题。C++异常是指在程序运行时发生的特殊情况。比如string::at函数下标越界等。
异常提供了一种转移程序控制权的方式。
一旦程序出现异常没有经过处理,就会造成程序运行崩溃。
处理异常的方式有:抛出异常(throw)和捕获异常(try - catch)
2、抛出异常-throw语句
可以使用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;
}
3、捕获异常
如果有一个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;
}
上述代码中可能会出现的几种情况:
- 无异常抛出,此时程序正常执行,不进入catch块。
- 异常抛出,正确捕获,此时程序进入catch块。
- 异常抛出,错误捕获(捕获类型不对),此时程序仍然会向上抛出寻求正确捕获,如果每一层都没有正确捕获,程序任然运行终止。
-
4、标准异常体系
#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;
}