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;
}