C++‘异常’处理机制

在C++的发展过程中,为了实际的需要,引入了异常处理机制。程序中常见的错误:语法错误运行错误,语法错误一般都是在编译时候发现的,编译器基本上都会报出错误的具体位置,因此这类错误一般都是比较好修改,运行错误一般不容易进行调试,比如说,程序崩溃(一般是由于栈溢出),运行结果错误(一般是算法的逻辑结构有问题)、程序非正常终止等现象。C++中引入异常处理(对运行时出现的差错进行处理),能够极大地提高程序的容错能力。

C++处理异常是利用try(检查)、throw(抛出)、catch(捕捉)三部分来进行处理的,把有可能出现异常的代码放到try块中,throw用来抛出一个异常信息,catch的参数一般为抛出的信息类型,如果抛出的类型和catch捕捉的类型相同时候,则就进行对应的异常处理。

下面是一个异常处理的例子:

#include <iostream>
using namespace std;
#include <math.h>
/*定义计算三角形面积的函数(利用海伦公式S = sqrt(q*(q - a)*(q - b)*(q - c)),其中q = (a+b+c)/2)满足三角形的条件:a+b>c  a+c>b  b+c>a(a,b,c都大于0)
*/

double triangle(double a, double b, double c)    
{
     double q = (a + b + c) / 2;
     if (a + b <= c || a + c <= b || b + c <= a)   //a,b,c这三个长度不能构成三角形
     {
          throw a;   //抛出异常
     }
     return sqrt(q * (q - a) * (q - b) * (q - c));   //求三角形面积
}

int main()
{
     double a, b, c;
     cin >> a >> b >> c;
     try    //检查是否出现异常,异常出现在两个方面,一是a,b,c中有可能为负数,或者两边之和不大于第三边
     {
          while (a > 0 && b > 0 && c > 0)
          {
               cout << triangle(a, b, c) << endl;
               cin >> a >> b >> c;
          }
     }
     catch (double)   //捕捉异常并处理
     {
          cout << a << " " << b << " " << c << "this is not triangle!" << endl;
     }
     system("pause");
     return 0;
}

在上面的例子中,三角形的三边长度有可能不满足构成三角形的条件,会发生异常,try块中为可能发生异常的代码,在triangle函数中,对三边的长度进行条件的判断,如果不满足,则将异常进行抛出,这时程序会返回主调函数中寻找对应的catch块,上面的throw a;a的数据类型为double类型,main函数中catch进行捕捉的类型也为double类型,两者相匹配,就执行catch块中的处理代码,然后程序不会返回被调用函数抛出的位置,而是直接执行catch后面的代码。

注意:

(1)try块中的代码不会影响原来执行的顺序,如果try中没有发生异常就会不执行catch块中的代码,而直接执行catch之后的代码。若出现异常,对异常进行抛出,流程会立即离开本函数,返回上一级的函数,则不会执行本函数throw后面的代码。

(2)流程返回到上一级函数时,系统会寻找与之匹配的catch块,进而执行。执行完catch块中的代码,紧接着执行catch块后面的代码,直到程序结束。

(3)被检测的部分必须放在try块中,否则会不起作用。catch块不能够单独使用,但是try块可以单独使用,但是只进行检查,而不进行错误处理。try和catch块中必须使用花括号括起来,哪怕块中只有一个语句。一个程序中只能有一个try块,但可以有多个catch块,可以进行多个问题的处理。catch只会检查参数的类型,不检查参数的值。

(4)若catch(doube b){};   则是将参数的double类型和throw a;的类型进行比较,然后将a的值赋值给b,即就是b=a;

若catch(...){};   则是不论什么类型,都会执行catch块中的代码。一般这样的catch会放在程序的最后,对于一些意想不到的异常进行处理,如果放在最开始则后面的catch就不会被执行。

(5)try-catch可以和throw在同一个函数中,也可以不在同一个函数中,若不在一个函数中,它们的catch执行满足下图的关系:

(6)如果throw的异常信息没有找到与之相匹配的catch,系统会自动调用一个系统函数terminate函数,使得程序停止运行。

时间: 2024-10-23 00:51:08

C++‘异常’处理机制的相关文章

异常捕获机制

在写代码的时候最怕代码写了几百上千行,可是一运行程序就崩溃:为了提高代码的健壮性,下面提供一种提高代码健壮性的方式: 异常捕获机制 1 // 异常捕获机制:提高代码的健壮性 2 @try---@catch---@finally 下面以一个打印数组的小Demo说明其用法 1 NSArray *arr = @[@10, @20, @30]; 2 @try { 3 /* 将有可能出问题导致程序崩溃的代码放在try语句体中 */ 4 NSLog(@"arr[3] = %@",arr[3]);

用c实现跨平台异常捕获机制

TBOX封装了一套跨平台的异常捕获实现,来模拟windows的seh异常处理功能,而且是线程安全的. 在linux/mac下的实现 使用signal 捕获异常信号 使用sigsetjmp保存现场寄存器和信号掩码,出现异常后使用 siglongjmp 跳转到异常处理过程,并恢复状态 使用线程局部存储维护 sigjmpbuf 寄存器现场状态堆栈,保证多线程安全,并且可以实现多层嵌套捕获处理. 在windows下的实现 这个就不用多说了,在vs下直接用 try.except 关键字就行了,如果在min

【 转】__try,__except,__finally,__leave异常模型机制

转自:http://blog.csdn.net/wwl33695/article/details/8686458 导读: 从本篇文章开始,将全面阐述__try,__except,__finally,__leave异常模型机制,它也即是Windows系列操作系统平台上提供的SEH模型.主人公阿愚将在这里与大家分享SEH( 结构化异常处理)的学习过程和经验总结. 深入理解请参阅<<windows 核心编程>>第23, 24章. SEH实际包含两个主要功能:结束处理(terminatio

程序有异常不知道咋办?来学习Java异常处理知识点和异常链机制

Java异常处理知识点和异常链机制异常处理是程序设计中一个非常重要的方面,毕竟人无完人,不可能永不犯错,程序中有异常是很正常的, Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,下面是我对Java异常知识和异常链的一个总结.一.Java异常的基础知识异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.有些异常需要做处理,有些则不需要捕获处理,在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免.不可预测的情况则在考虑异常发生时如何处理.J

第三方接口调用异常补偿机制实现实例记录

背景: 我们的组件(简称A),在业务链中属于数据支撑节点.其中与组件B存在接口同步数据的直接关系(API接口直接调用进行数据交互) 问题: 我们的上游有另一个组件C(带有界面),调用A(us)进行数据的变更操作,此时需要A调用B服务接口进行同步,问题出在这里,C调用 A通常速度比较快,比较稳定,但是A调用B经常超时或者失败,网络原因or 组件B自己的设计原因吧,反正是推不动 方案:经沟通考察,这条数据的变更在可接受的时间范围只要最终一致即可,于是首先,我们先将事物中的调用B服务的一系列逻辑抽出来

C#基础知识点之try catch 异常捕获机制

一.C#的异常处理所用到关键字 try 用于检查发生的异常,并帮助发送任何可能的异常. catch 以控制权更大的方式处理错误,可以有多个catch子句. finally 无论是否引发了异常,finally的代码块都将被执行. throw 用于引发异常,可引发预定义异常和自定义异常. 二.C#异常处理的格式 try { 程序代码块: } catch(Exception e) { 异常处理代码块: } finally { 无论是否发生异常,均要执行的代码块: } 三.异常处理实战 一个除数和零的简

C#中的异常捕获机制(try catch finally)

一.C#的异常处理所用到关键字 try :用于检查发生的异常,并帮助发送任何可能的异常. catch :以控制权更大的方式处理错误,可以有多个catch子句.  finally: 无论是否引发了异常,finally的代码块都将被执行.  throw: 用于引发异常,可引发预定义异常和自定义异常. 二.C#异常处理的格式 1 try 2 { 3 //程序代码块: 4 } 5 catch(Exception e) 6 { 7 //异常处理代码块: 8 } 9 finally 10 { 11 //无论

Java异常机制 学习笔记一

什么是异常? 异常,不正常也.Exception是Exception event的缩写,因此异常是一个事件,该事件发生在程序运行时. 异常会影响程序的连续性,使程序中断. 在Java中,一切皆对象,所以要定义异常,也需要使用对象.异常对象里封装了异常类型和程序发生异常时的状态. 我们经常说的抛出异常就是创建异常对象,并提交给运行系统. 异常捕获机制 当异常发生时,我们需要知道异常在哪里发生的,那么怎么定位异常的出处呢? 在Java中,使用call stack来记录方法调用顺序.当Java程序发生

C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)

白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :-). 还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准.想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销.异常处理由于涉及大量底层内容,向来是 C++ 各种高级机制中较难理解和透彻掌握的部分.本文将在尽量少引入底层细节的前提下,讨论 C++ 中这一