C++ 编程异常处理(try - throw - catch)详解

文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。


笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888

1、背景

  程序运行中,有些错误是可以预料但是却无法避免的,这时我们为了保证程序的正常运行,就需要做一些特殊的处理 —— 异常处理。异常处理是 C++ 发展后期增加的新功能,以便于帮助程序开发人员更方便的进行程序的设计和调试工作。

  异常处理是对所有能预料的运行错误进行处理的一套实现机制。在异常处理的协助下,C++ 程序开发人员可以在环境出现异常情况或者用户操作不当的情况,做出正确合理的处理和防范。

2、异常处理的概述

  系统在运行过程中出现的错误,均称为异常。我们在程序开发过程,遇到的错误可以简单来分为两部分:编译时的错误运行时的错误

编译时的错误: 主要是指我们在进行代码编译时遇到的错误,这一块主要体现在语法错误,比如关键词拼写错误,括号不匹配等语法错误。这些错误编译器就会很明确的告诉我们出错的位置,修改起来也就比较方便。

运行时的错误:主要指那些我们在开发过程中很难预料到的错误,比如算法错误,内存异常使用,文件打开异常,数组越界等,这些错误我们在进行编译时很难发现,只有在程序运行时,导致程序异常终止或者出现死机的现象时,我们才能意识到。这类错误比较隐蔽,不易被发现,可以说是程序调试中的一个难点。

  这里我们使用一个比较传统的异常处理方法进行举例:

#include "stdafx.h"
#include <iostream>
using namespace std;

int DevFun(int a, int b)
{
    
    
	if ( 0 == b)  //除数为 0 , 打印异常提示,并返回 0
	{
    
    
		cout << "除数不能为 0 !, and return " ;
		return 0;
	}
	return a / b;
}

int main()
{
    
    
	cout << DevFun(6, 2) << endl;
	cout << DevFun(6, 0) << endl;  //除数为 0
	system("pause");
    return 0;
}

在这里插入图片描述

3、异常处理的方法

  C++异常处理的思路:如果在执行一个函数的过程中出现了异常,可以不再本函数中立即处理,而是发出一个信息,传给它的上一级(即调用函数)来解决,如果上一级也不能处理,就在传给它的上一级,如此逐级上传,直到高级一级能够处理;如果达到了最高一级依旧无法处理,运行系统一般会自动调用系统函数 terminate(),由它调用 abort 终止程序。
  这样的异常处理方法使得异常的引发和处理机制分离,而不是由同一个函数完成。这样做的优点就是:底层函数注重数据处理任务,而不必过多考虑对异常的处理,以减轻底层函数的负担。比如在主函数中调用狠多函数,我们不需要再每个函数中进行异常处理,只需要在主函数中设计针对不同类型的异常处理即可。

  C++ 的异常处理机制是由 检查(try)、抛出(throw)、捕获(catch)三个部分组成。

3.1、异常的抛出(throw)

  如果在某段程序中发现了异常,就可以使用 throw 语句抛出这个异常给上一级调用者。

格式: throw 表达式;

  • 表达式:表示抛出的异常类型,异常类型由表达式的类型来表示。

3.2、异常的检查与捕获(try-catch)

  用于检查被调用的函数(功能模块)是否存在异常,并且在存在异常的情况下进行捕获。

格式:

try
{
    
    
	//被调用的函数(功能模块)
}
catch (异常类型1)
{
    
    
	//进行异常处理1
}
catch (异常类型2)
{
    
    
	//进行异常处理2
}
...
catch (异常类型n)
{
    
    
	//进行异常处理n
}
  • try { … }: 表示开始检查 被调用的函数(功能模块) —— 也就是容易一起异常的语句。
  • catch ( type ) { … }: 用于捕获 throw 抛出的异常,并根据抛出的类型匹配需要进行的异常处理。type 可以使用 (删节号) 来表示任类型。
#include "stdafx.h"
#include <iostream>
using namespace std;

int DevFun(int a, int b)
{
    
    
	if ( 0 == b)  //除数为 0 , 打印异常提示,并返回 0
	{
    
    
		throw b; //抛出异常
	}
	return a / b;
}

int main()
{
    
    
	try
	{
    
    
		cout << DevFun(6, 2) << endl;
		cout << DevFun(6, 0) << endl;  //除数为 0
	}
	catch (int)  //捕获到异常(捕获到int类型),打印输出, catch (...) 表示任意类型
	{
    
    
		cout << "除数不能为 0 !";
	}
	system("pause");
    return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Aliven888/article/details/114227287