21天学C++(二十)异常和错误处理

完整目录、平台简介、安装环境及版本:参考《21天学C++ 概览》

二十、异常和错误处理

20.1 程序中的各种错误

程序中的各种错误bugs、errors、mistakes和code rot

  • 有的bug在编译时发现;
  • 有的bug在程序运行过程中发现;
  • 开发过程中发现问题越晚,修改它所付出的代价就越大;
  • 为了避免弱点,致力于使程序具有很有的防崩溃功能,从而解决在运行中发生的任何事情,包括用户各种奇怪的输入、内存不足等;
  • bug:是因为程序员发生错误而引起的;
  • 逻辑错误:是因为程序员对问题的不了解,或是对问题的解决方式不了解造成的;
  • 异常:是因为不常见、但可以预见的问题如资源(内存或硬盘空间)不足等问题引起的;

20.2 异常

无法完全消除异常情况,只能采取措施准备解决它们,包括:

  • 崩溃;
  • 通知用户并安全退出;
  • 通知用户,允许用户尽量恢复并继续执行;
  • 执行正确的操作,在不影响用户的情况下继续运行;

异常的概念:

  • 在程序中资源的实际分配(如内存分配或文件的锁定)通常是在很低的水平上实现的;
  • 当操作失败、内存不能分配、文件不能锁定时所采取的措施的逻辑在程序中通常是较高级的,而代码是用来和用户进行交互;
  • 异常提供了一条从分配资源到可以处理错误情况的代码的快捷路径。

C++的异常处理提供了一个类型安全的,集成方法来处理在运行一个程序时出现的、可以预见的、但不常发生的情况。

20.2.1 异常的使用

异常格式如代码所示,使用异常的基本步骤:

  • 表示程序中你开始执行一个可能产生异常的操作代码区域并将它放入try块中;
  • 创建catch块在异常抛出后捕捉他们,清除所分配的内存,在使用的时候通知用户;
  • 异常是用来传递有关错误的信息的对象;
  • Try块是用大括号括起来的块,其中可能抛出一个异常;
  • Catch是紧跟在try块后面的块,在其中对异常进行处理;
  • 当抛出一个异常时,控制转向紧接当前try块的catch块。
try{
    SomeDangerousFunction();
}
catch(OutOfMemory){
    //take some actions
}
catch(FileNotFound){
    //tack other actions
}
#include <iostream>
#include <exception>
using namespace std;

int main(){
	int arr[20];
	try{
		for (int index=0; index<25; index++){
			if (index >= 20){
				throw "out of bound";
			}
			arr[index] = index;
			cout<<arr[index]<<endl;
		}
	}
	catch( const char* e){
		cout<<e<<endl;
	}
	return 0;
}

执行结果如下:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
out of bound
请按任意键继续. . .

20.2.2 捕获异常

每个try后都跟一个或几个catch语句;

  • 如果异常和其中一个catch语句匹配,就认为通过这条语句执行处理了异常;
  • 如果没有匹配,将继续展开堆栈,如果知道main还没有捕捉到,则调用内置函数终止程序; 

堆栈的展开是一条单行马路,在进行过程中,堆栈被打开而堆栈中的对象被释放;

一旦异常被处理,程序接着try后的catch语句继续执行,而不是抛出异常的地方之后执行;

#include <iostream>
#include <exception>
using namespace std;

void fun1();
void fun2();
int main(){
	int arr[20];
	try{
		fun1();
	}
	catch( const char* e){
		cout<<"main : "<<e<<endl;
	}
	return 0;
}

void fun1(){
	try{
		fun2();
	}
	catch( const char* e){
		cout<<"fun1 : " <<e<<endl;
		throw e;
	}
}
void fun2(){
	try{
		throw "out of bound";
	}
	catch( const char* e){
		cout<<"fun2 : " <<e<<endl;
		throw e;
	}
}

执行结果如下:

fun2 : out of bound
fun1 : out of bound
main : out of bound
请按任意键继续. . .
#include <iostream>
#include <exception>
using namespace std;

void fun1();
void fun2();
int main(){
	int arr[20];
	try{
		fun1();
	}
	catch( const char* e){
		cout<<"main : "<<e<<endl;
	}
	return 0;
}
void fun1(){
	fun2();
}
void fun2(){
    throw "out of bound";
}

执行结果如下:

main : out of bound
请按任意键继续. . .

发表回复