.1.1传统错误处理机制
通过函数返回值来处理错误。做逻辑处理的是一层函数,做业务的是一层函数,这样分层更加合理.
8.1.2异常处理的基本思想
1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以再适当的位置设计对不同类型异常的处理。
2)异常是专门针对抽象编程中的一系列错误处理的,C++中不能借助函数机制,因为栈结构的本质是先进后出,依次访问,无法进行跳跃,但错误处理的特征却是遇到错误信息就想要转到若干级之上进行重新尝试,如图
3)异常超脱于函数机制,决定了其对函数的跨越式回跳。
4)异常跨越函数
8.2 C++异常处理的实现
8.2.1异常基本语法
1) 若有异常则通过throw操作创建一个异常对象并抛掷。
2) 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。
3) 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。
4) catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。
5) 如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。
6)处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔。
#include<iostream>
using namespace std;
//1 基本语法
//2 发生异常之后,异常是跨函数 :
//3 接受异常以后 可以不处理,再次抛出异常
//4 catch异常的时 按照类型进行catch
//5 异常捕捉严格按照类型匹配
void divide(int x,int y)//除法,除数不能为0
{
if (y==0)
{
throw x;//抛出int类型异常
}
cout << "divide的结果是:" << x / y << endl;
}
void myDivide(int x,int y)
{
try
{
divide(x, y);
}
catch (...)//其他未知类型的异常,没有考虑到的异常类型
{
cout << "我接受了divide类型的异常,但是我没有处理,向上抛出" << endl;
throw;
}
}
int main(void)//异常时跨函数执行的
{
try
{
//throw 0;//这里可以直接抛出异常,直接调用catch语句继续执行,则下面三行不能执行
divide(3, 2);
divide(10, 0);
myDivide(10, 0);
}
catch (int e)
{
cout << "除数不能为0" << endl;
}
catch (...)
{
cout << "其他没有被捕捉到的异常种类" << endl;
}
system("pause");
return 0;
}