C++之try catch 异常处理入门实例
作者:mdxy-dxy 发布时间:2021-09-13 04:42:07
在程序设计过程中,我们总是希望自己设计的程序是天衣无缝的,但这几乎又是不可能的。即使程序编译通过,同时也实现了所需要的功能,也并不代表程序就已经完美无缺了,因为运行程序时还可能会遇到异常,例如当我们设计一个为用户计算除法的程序时,用户很有可能会将除数输入为零,又例如当我们需要打开一个文件的时候确发现该文件已经被删除了……类似的这种情况很有很多,针对这些特殊的情况,不加以防范是不行的。
我们通常希望自己编写的程序能够在异常的情况下也能作出相应的处理,而不至于程序莫名其妙地中断或者中止运行了。在设计程序时应充分考虑各种异常情况,并加以处理。
在C++中,一个函数能够检测出异常并且将异常返回,这种机制称为抛出异常。当抛出异常后,函数调用者捕获到该异常,并对该异常进行处理,我们称之为异常捕获。
C++新增throw关键字用于抛出异常,新增catch关键字用于捕获异常,新增try关键字尝试捕获异常。通常将尝试捕获的语句放在 try{ } 程序块中,而将异常处理语句置于 catch{ } 语句块中。
异常处理的基本语法如下所述。首先说一下抛出异常的基本语法:
throw 表达式;
抛出异常由throw关键字加上一个表达式构成。抛出异常后需要捕获异常以及异常处理程序,其基本语法如下:
try
{
//可能抛出异常的语句
}
catch (异常类型1)
{
//异常类型1的处理程序
}
catch (异常类型2)
{
//异常类型2的处理程序
}
// ……
catch (异常类型n)
{
//异常类型n的处理程序
}
由try程序块捕获throw抛出的异常,然后依据异常类型运行catch程序块中的异常处理程。catch程序块顺序可以是任意的,不过均需要放在try程序块之后。
[例1] C++异常处理示例:
#include<iostream>
using namespace std;
enum index{underflow, overflow};
int array_index(int *A, int n, int index);
int main()
{
int *A = new int[10];
for(int i=0; i<10; i++)
A[i] = i;
try
{
cout<<array_index(A,10,5)<<endl;
cout<<array_index(A,10,-1)<<endl;
cout<<array_index(A,10,15)<<endl;
}
catch(index e)
{
if(e == underflow)
{
cout<<"index underflow!"<<endl;
exit(-1);
}
if(e == overflow)
{
cout<<"index overflow!"<<endl;
exit(-1);
}
}
return 0;
}
int array_index(int *A, int n, int index)
{
if(index < 0) throw underflow;
if(index > n-1) throw overflow;
return A[index];
}
本例展示了一个数组越界的异常捕获程序。array_index函数用于返回数组index下标的数值,如果出现异常则抛出异常。try程序块中的程序语句为可能出现异常情况的语句,catch则为针对异常的处理语句。在程序一开始我们定义了一个全局的枚举类型变量index,并且定义了两个值,分别为underflow和overflow,这两个值作为抛出异常的返回值。当在主函数要求输出越界的数组值时,调用array_index函数,一旦有预定异常抛出,则通过try捕获并根据catch语句针对异常情况作出处理。
在前面我们介绍了new和delete动态分配内存操作符,如果new或new[]不能成功分配所请求的,将会抛出一个bad_alloc异常。在使用new或new[]操作符分配动态内存,可以通过如下方式检测并捕获存储空间分配失败的异常。
[例2] 捕获new、new[] 抛出的异常:
int * p;
try
{
p = new int[10];
}
catch(bad_alloc)
{
cerr<<"allocate failure!"<<endl;
exit(-1);
}
在C语言中,异常通常是通过函数返回值获得,但这样一来,函数是否产生异常则需要通过检测函数的返回值才能得知。而在C++中,当函数抛出一个返回值时,即使不用try和catch语句,异常还是会被处理的,系统会自动调用默认处理函数unexpected来执行。
下面是其他网友的补充
#include <exception>
#include <iostream>
using namespace std;
/**********************************
//project -> Properties -> C/C++ -> Code Generation --> Enable C++ Exceptions
//选择 Yes with SEH Exceptions (/EHa) 这样的话C++的try catch 也可以捕获到空指针,内存越界,0除异常
//默认是选择Yes (/EHsc)
**********************************/
void TestIntType()
{
try
{
throw 1;
}
catch(...)
{
cout<< "在 try block 中, 准备抛出一个异常." << endl;
}
}
void TestDoubleType()
{
try
{
throw 0.5;
}
catch(...)
{
cout<< "在 try block 中, 准备抛出一个异常." << endl;
}
}
void TestEmptyPointType()
{
try
{
int* p = NULL;
*p = 3;
}
catch(...)
{
cout<< "非法地址操作异常" << endl;
}
}
void TestDivZeroType()
{
try
{
int b = 0;
int a = 3/b;
}
catch(...)
{
cout<< "0除异常" << endl;
}
}
void TestMemoryOutType()
{
int * a = new int[4];
try
{
for (int i = 0; i<245; i++)
{
a++;
}
*a = 3;
}
catch(...)
{
cout<< "内存越界异常" << endl;
}
}
int main(int argc, char* argv[])
{
TestEmptyPointType();
//TestDivZeroType();
TestMemoryOutType();
return 1;
}


猜你喜欢
- C#时间/日期格式大全,C#时间/日期函数大全有时候我们要对时间进行转换,达到不同的显示效果默认格式为:2005-6-6 14:33:34如
- 下面的每一步应该都必不可少:1、启动类继承这个类,并且重新configure这个方法,return builder.sources(Code
- 简介之前在项目中遇到了一个新需求,领导让我使用本地缓存,来缓存数据库查出的用户信息,经过一番资料查阅和实验,最终确定了使用Caffeine来
- 系统需要用到一个导入excel文件的功能,使用poi组件常规方式读取excel时,内存耗尽,OutOfMemoryError,或者读取非常慢
- 一、案例场景遇到过这样的场景,在定义一个static修饰的Map时,使用了大量的put()方法赋值,就类似这样——public static
- 现在软件或者网页的并发量越来越大了,大量请求直接操作数据库会对数据库造成很大的压力,处理大量连接和请求就会需要很长时间,但是实际中百分之80
- 好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些
- java编码中经常用到代理,代理分为静态代理和 * 。其中 * 可以实现spring中的aop。一、静态代理:程序运行之前,程序员就要编
- 本文实例为大家分享了C#使用Socket实现本地多人聊天室的具体代码,供大家参考,具体内容如下【脚本一:Server端】使用本机地址:127
- 网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上,并且可以和
- 一、脚本生命周期Unity脚本中的常见必然事件如下表所示名称触发时机用途Awake脚本实例被创建时调用用于游戏对象的初始化,注意Awake的
- 今天在面试时遇到一道算法的题:给定一个字符串,输出每次字符出现的次数;要求按照顺序输出;自己的思路开始是:1.把String转换char数组
- 本文实例为大家分享了C#访问共享文件夹或者磁盘的具体代码,供大家参考,具体内容如下SharedTool:using System; &nbs
- 本文实例讲述了Android编程实现小说阅读器滑动效果的方法。分享给大家供大家参考,具体如下:看过小说都知道小说阅读器翻页有好多种效果,比如
- 这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 问题 @Cacheable注解不支持配置过期时间,所有需要通过配置CacheManneg来配置默认的过期时间和针对每个类或者是方法进行缓存
- 0x00 前言在一些比较极端情况下,C3P0链的使用还是挺频繁的。0x01 利用方式利用方式在C3P0中有三种利用方式http baseJN
- 背景环境已学习java基础,html,css,js,jquery,bootstrap,layui,maven,servlet和jsp,刚进入
- 一.介绍观察者模式(Observer Pattern)属于行为型模式。定义了对象之间的一对多依赖,让多个观察者同时监听某一个主题对象,类似于
- spring mvc url匹配禁用后缀访问在spring mvc中默认 访问url 加任意后缀名都能访问比如:你想访问 /login ,但