【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

这篇具有很好参考价值的文章主要介绍了【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。





一、异常处理




1、异常概念引入


异常是一种 特殊的程序流控制机制 , 用于处理程序中可能出现的错误或异常情况 ;

当程序执行错误时 , 由 throw 关键字抛出异常 , 并即跳转到相应的异常处理程序中 ; 如果没有适当的异常处理程序处理该异常 , 程序会崩溃终止 ;


异常与函数对比 :

  • 函数 是一种 以 栈结构 展开的上下函数衔接的程序控制系统 ;
  • 异常 是一种 特殊的程序流控制机制 , 用于处理程序中可能出现的错误或异常情况 ; 异常 依附于栈结构 , 却可以同时设置多个 异常类型 作为 异常捕获条件 ;

异常是跨函数的 , 下图中 函数 f 调用 函数 g , 函数 g 调用 函数 h ;
【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 ),C++,c++,异常处理,try,异常捕获,抛出异常
在 函数 h 中抛出异常 , 异常会沿着函数 调用顺序 , 先抛给 函数 g , 如果 g 不处理 , 则继续向上抛给 函数 f ;

上述 异常处理 机制 , 可以在不同的函数中 进行 抛出异常 和 处理异常 的操作 ;

这样 函数设计开发时 只需要解决具体的问题 , 不需要过多考虑 异常处理 ;


2、抛出异常语法


抛出异常 语法 : 使用 throw 关键字 , 抛出异常对象 ;

throw 异常对象;

代码示例 : 在下面的函数中 , 抛出一个 int 类型的异常 ;

// 1. 在 函数 中 抛出异常
void fun(int a) {
	if (a == 0) {
		// 抛出一个 int 类型的异常
		throw 2;
	}
}

3、捕获异常语法


异常捕获 语法 : 在 try 代码块中执行 可能抛出异常的 代码 , 如果出现异常 , 就可以在 catch 分支中进行捕获 ;

try {
	// 出现异常的代码块
} catch( 异常类型声明 )

代码示例 : 下面的代码中 , 捕获 try 代码块中产生的异常 ,

  • 如果捕获到 int 类型的异常 , 则执行 catch (int e) 分支中的代码 ,
  • 如果捕获到其它类型的异常 , 则执行 catch ( … ) 分支中的代码 ;
	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun(0);
	}
	catch (int e)
	{
		cout << "捕获到异常 : " << e << endl;
	}
	catch ( ... )
	{
		// 捕获 ... 可以捕获未知其它类型的异常
		cout << "捕获到未知类型异常"<< endl;
	}

4、异常捕获流程


异常捕获流程 :

  • 抛出异常 : 如果遇到错误 , 需要抛出异常 , 可以使用 throw 关键字 , 抛出一个异常对象 , 这个异常对象可以是任意类型 , 如 int 类型 ;
  • try 代码块处理异常 : 在 try 代码块中 , 执行可能抛出异常的代码 , 上方的代码顺序执行到达 try 代码块时 , 则进入 try 代码块 继续执行其中的代码 ;
    • 正常执行 : 如果 try 保护段代码正常执行 , 没有出现异常 , 则执行完毕后继续执行 后续代码 , 最后一个 catch 分支之后的代码 ;
    • 出现异常 :
      • 捕获异常 : 如果出现了异常 , 恰好被 catch 分支捕获 , 则执行 catch 分支代码 ;
        • 处理异常 : 如果能处理该异常 , 则处理异常错误 ;
        • 继续向上抛出异常 : 如果无法处理 , 则继续向上抛出给调用者 , 让上一级函数处理 ;
      • 未捕获异常 : 如果出现了异常 , 没有被 catch 分支捕获 , 则运行 terminate 函数 , 在该函数中调用 abort 终止程序 ;




二、异常处理代码示例




1、错误代码示例 - 抛出异常 / 不捕获异常


错误代码示例 : 在下面的代码中 , 没有捕获异常 , 则在执行时会报错 : " 0x755FF932 处(位于 HelloWorld.exe 中)有未经处理的异常 " ;

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
void fun(int a) {
	if (a == 0) {
		// 抛出一个 int 类型的异常
		throw 2;
	}
}

int main() {

	// 调用可能产生异常的函数
	fun(0);

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

0x755FF932(位于 HelloWorld.exe 中)有未经处理的异常: 
Microsoft C++ 异常: int,位于内存位置 0x00F6FB6C 处。 

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 ),C++,c++,异常处理,try,异常捕获,抛出异常


2、正确代码示例 - 抛出异常 / 捕获异常


异常捕获完整代码示例 :

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
void fun(int a) {
	if (a == 0) {
		// 抛出一个 int 类型的异常
		throw 2;
	}
}

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		fun(0);
	}
	catch (int e)
	{
		cout << "捕获到异常 : " << e << endl;
	}
	catch ( ... )
	{
		// 捕获 ... 可以捕获未知其它类型的异常
		cout << "捕获到未知类型异常"<< endl;
	}

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

捕获到异常 : 2
请按任意键继续. . .

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 ),C++,c++,异常处理,try,异常捕获,抛出异常


3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常


异常是跨函数的 , 异常会从本函数中抛给调用本函数的调用者 ( 调用函数 ) ;

  • 如 : 在 main 函数中调用 fun 函数 , 如果 fun 函数中抛出异常 , 则抛给了 main 函数 , 需要在 main 函数中捕获并处理异常 ;

在下面的示例中 , fun2 函数中捕获 fun 函数中的 异常未处理 , 抛到了 main 函数中 ;

main 函数中的异常必须处理 , 否则程序崩溃 ;


代码示例 :

#include "iostream"
using namespace std;

// 1. 在 函数 中 抛出异常
void fun(int a) {
	if (a == 0) {
		// 抛出一个 int 类型的异常
		throw 2;
	}
}

// 3. 捕获异常不处理 , 继续向上抛出
void fun2(int a) {

	try
	{
		// 执行可能抛出异常的函数
		fun(a);
	}
	catch (int e)
	{
		// 捕获到了异常, 但是不处理继续向上抛出
		throw;
	}

}

int main() {

	// 2. 捕获并处理异常
	try
	{
		// 调用可能产生异常的函数
		//fun(0);

		// 异常是跨函数的
		// 调用可能产生异常的函数
		// 该 fun2 函数中捕获 fun 函数中的 异常未处理 
		// 抛到了 main 函数中
		fun2(0);
	}
	catch (int e)
	{
		cout << "捕获到异常 : " << e << endl;
	}
	catch ( ... )
	{
		// 捕获 ... 可以捕获未知其它类型的异常
		cout << "捕获到未知类型异常"<< endl;
	}

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

捕获到异常 : 2
请按任意键继续. . .

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 ),C++,c++,异常处理,try,异常捕获,抛出异常文章来源地址https://www.toymoban.com/news/detail-757123.html

到了这里,关于【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java异常处理机制(二)之异常处理与捕获

    1 Error(错误): 是指程序无法处理的错误,表示运行应用程序时比较严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java 虚拟机)出现的问题。 2 异常(Exception): 是指在程序执行时由于程序处理逻辑上的错误而导致程序中断的一种指令流。通俗的

    2024年02月05日
    浏览(108)
  • Java 异常处理以及如何捕获和处理多个异常

    在Java中,我们使用异常处理程序组件try,catch和finally块来处理异常。 为了捕获和处理异常,我们将try...catch...finally代码块放置在可能产生异常的代码周围。finally块是可选的。 try...catch...finally的语法为: 可能会生成异常的代码放在try块中。 每个try块后面应紧跟着catch 或 fi

    2024年02月14日
    浏览(44)
  • 爬虫异常处理:异常捕获与容错机制设计

    作为一名专业的爬虫程序员,每天使用爬虫IP面对各种异常情况是我们每天都会遇到的事情。 在爬取数据的过程中,我们经常会遇到网络错误、页面结构变化、被反爬虫机制拦截等问题。在这篇文章中,我将和大家分享一些关于如何处理爬虫异常情况的经验和技巧。通过异常

    2024年02月11日
    浏览(44)
  • 解决拦截器抛出异常处理类的500状态码Html默认格式响应 !

    解决方式 将Java对象转换为JSON格式的响应,使用spring-mvc.xml配置适当的消息转换器。 问题出处的相关类如下 interceptor如下  自定义异常类  异常处理类

    2024年02月09日
    浏览(42)
  • Python 异常捕获与处理

    当我们写程序难免遇到报错,专业的称呼叫做异常,行业俗语叫做bug,由于异常情况出现会导致代码停止运行,所以在编写过程中要尽可能避免。 语法错误 这一类错误很好理解,相当于你不会写,比如用if或for的时候不知道他们怎么写,这种情况比较夸张了,好好学过的人都

    2023年04月22日
    浏览(56)
  • 爬虫异常捕获与处理方法详解

    Hey!作为一名专业的爬虫代理供应商,我今天要和大家分享一些关于爬虫异常捕获与处理的方法。在进行爬虫操作时,我们经常会遇到各种异常情况,例如网络连接错误、请求超时、数据解析错误等等。这些异常情况可能会导致程序崩溃或数据丢失,因此,我们需要学会如何

    2024年02月11日
    浏览(45)
  • c++捕获异常

    catch  块跟在  try  块后面,用于捕获异常。您可以指定想要捕捉的异常类型,这是由 catch 后的括号内的异常声明决定的。 try { // 保护代码 }catch( ExceptionName e ) { // 处理 ExceptionName 异常的代码 } 上面的代码会捕获一个类型为  ExceptionName  的异常。如果您想让 catch 块能

    2024年02月09日
    浏览(39)
  • Python十类常见异常类型(附捕获以及异常处理方式)

    大家好,我是辣条哥!今天给大家讲讲我们刚开始写代码是都会出现的问题-我们刚开始常见的异常以及处理方法! 异常是指在程序运行过程中出现的错误或异常情况,例如除以0、访问不存在的变量等。Python提供了一些内置的异常类型,同时也支持自定义异常类型。 想找辣条

    2024年02月08日
    浏览(86)
  • php捕获Fatal error错误与异常处理

    在php5的版本中,如果出现致命错误是无法被 try {} catch 捕获的,如下所示: 运行脚本,最终php报出一个Fatal error,并程序中止 有些时候,我们需要捕获这种错误,并做相应的处理。 那就需要用到 register_shutdown_function() 和 error_get_last() 来捕获错误 对于php7中的错误捕获,因为

    2024年02月19日
    浏览(59)
  • 【小沐学C++】C++ 捕获程序异常奔溃minidump

    并不是所有的bug都可以在发布前找到,也就是说并不是所有的抛出异常的bug都可以在发布前找到。幸运的是,微软在 Platform SDK 中包含了一个功能,可以帮助开发人员收集用户发现的异常信息。MiniDumpWriteDump函数将必要的故障转储信息写入文件,而不节省整个进程空间。此故障

    2024年02月06日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包