打印
[开发资料]

C++程序异常处理机制

[复制链接]
648|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1、什么是异常处理?   
有经验的朋友应该知道,在正常的C和C++编程过程中难免会碰到程序不按照原本设计运行的情况。

最常见的有除法分母为零,数组越界,内存分配失效、打开相应文件失败等等。

一个程序的健壮不仅仅有算法上的优越性,还存在程序对各种异常情况的识别和处理能力,如果对这些异常没有得到较好的处理,就非常容易引起程序的奔溃。

那么C++设计了一套异常处理机制,一方面能够使得异常处理和正常运行代码进行分离,使得程序更加模块化;另一方面,C++的异常处理可以不需要异常处理在异常发生时的同一个函数,而是可以在更上层合适的位置进行处理。

下面,我们一起来看看C++的异常处理。

2、异常处理语法  
C++异常处理涉及到3个关键字:

throw---抛出一个异常,带参数
try---用于标识可能会出现异常的代码段
catch--是用于标识异常处理的代码段
下面以一个例子来说明它们的使用方法:

#include <iostream>
using namespace std;

int main(int argc, char** argv) {

try{

  cout<<"Run Normal"<<endl;
  throw 2;  //抛出异常
  cout<<"No arrived"<<endl;
}

catch(int a) //异常代码处理块
{
  cout<<"Error : "<<a<<endl;
}

return 0;
}

try所标识的为程序正常运行的代码段,所以首先打印"Run Normal"字符串,由于遇到了throw抛出此处程序存在异常,程序便会跳出try所标识的代码段,然后寻找catch所标识的异常处理代码段,这便会匹配到了正下方的catch输出"Error : 2”字样。

3、try-catch注意事项  
上面的例子挺简单的,不过异常处理机制还有很多值得注意的使用方法:

1、当throw抛出异常以后,会以函数调用的方式一层一层的寻找相应的catch,如果当前函数层没有找到会立马返回到上层函数进行查找,如果一直没有找到程序就会停止运行。



写个demo验证一下:

#include <iostream>
using namespace std;


void FunctionDown(void)
{
cout<<"Run Normal"<<endl;
throw 2;  //抛出异常
cout<<"No arrived"<<endl;

}

void FunctionMid(void)
{

FunctionDown();
}

void FunctionUp(void)
{
try
{
  FunctionMid();
}

catch(int a) //异常代码处理块
{
  cout<<"Error : "<<a<<endl;
}
}

int main(int argc, char** argv) {

FunctionUp();

return 0;
}

该程序最后运行的结果与前面的是一致的,这样函数内部的异常都可以抛出来最后统一处理。

2、同一个try可以带多个catch用于不同异常的处理。且不同的catch依次匹配异常参数,匹配后便会执行,否则会继续往上层进行catch匹配。

老规矩,写个代码验证一下:

#include <iostream>
using namespace std;


void FunctionDown(void)
{
cout<<"Run Normal"<<endl;
//throw "bug";  //抛出异常
throw (float)3.14;  //抛出异常
cout<<"No arrived"<<endl;

}

void FunctionMid(void)
{

FunctionDown();
}

void FunctionUp(void)
{
try
{
  FunctionMid();
}

catch(int a) //异常代码处理块
{
  cout<<"Error : "<<a<<endl;
}
}

int main(int argc, char** argv) {

try
{
  FunctionUp();
}

catch(float a) //异常代码处理块
{
  cout<<"Error : "<<a<<endl;
}
catch(char const *str) //异常代码处理块
{
  cout<<"Error : "<<str<<endl;
}

return 0;
}

最终由于FunctionMid内的catch的参数无法匹配上,则继续往上层进行catch匹配,直到匹配到main函数中的catch(float a)才成功。

   4、最后   
好了,关于C++异常处理try-catch今天就简单介绍到这里了,希望这篇文章能对大家有所帮助。

使用特权

评论回复
沙发
小耳朵图图| | 2024-5-22 15:02 | 只看该作者
学习一下

使用特权

评论回复
板凳
szt1993| | 2024-7-22 13:49 | 只看该作者
异常处理的思路非常清晰

使用特权

评论回复
地板
jf101| | 2024-7-22 14:41 | 只看该作者
异常处理能够解决那些层面的问题?

使用特权

评论回复
5
中国龙芯CDX| | 2024-7-26 23:23 | 只看该作者
异常处理机制非常实用

使用特权

评论回复
6
LOVEEVER| | 2024-8-9 20:03 | 只看该作者
C++异常处理还有其他简单的形式嘛?

使用特权

评论回复
7
OKAKAKO| | 2024-11-14 08:20 | 只看该作者
C++异常处理try-catch形式上很简单

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

199

主题

1668

帖子

2

粉丝