异常处理

来源:互联网 发布:win7一直在识别网络 编辑:程序博客网 时间:2024/05/21 10:47

      这部分讨论异常处理,异常是指程序运行时发生的错误。通过使用C++的异常处理子系统,可以用结构化和可控制的方式来处理运行时错误。如果使用了异常处理机制,那么在发生异常时,程序将自动激活一个错误处理例程。异常处理的主要好处在于:在以前的大型程序中,你不得不通过手工的方式来输入错误处理代码。而现在异常处理则可以自动完成这些工作。

      还将进一步讨论C++中的动态内存分配运算符:new和delete,如果new不能分配所要求的内存,那么它将产生一个异常。在这部分中,将会学习如何来处理这种异常。还将学到如何重载运算符new和delete来定义自己的动态内存分配机制。

1、异常处理的基础

      C++的异常处理机制建立在3个关键字之上:try、catch、throw。最常见的情况是,在try代码块中包含你想监控的程序部分,如果try中的程序发生了一个异常(例如一个错误),那么这个异常将被抛出(使用throw),然后我们可以通过catch来捕获并处理这个异常。你想要监控的程序部分必须包含在try块中(在try块中调用的函数也将被监控)。程序抛出的异常将被紧跟在try语句之后的catch语句捕获。try和catch的通用形式如下:

try
{
      //try代码块
}
catch(type1 arg)
{
      //catch代码块
}
catch(type2 arg)
{
      //catch代码块
}
catch(type1 arg)
{
      //catch代码块
}

try中必须包含你想要控制的程序段,这个程序段可能是一个函数中的几条语句,或者也可以将整个main()函数都包含在try中(这样整个程序都将被监控)。当在try中的程序抛出一个异常时,它将被相应的catch语句捕获并处理,在try语句后面能修复产生的异常,那么在catch中调用函数exit()或者abort()来终止程序的执行。

      exit()和abort()都是C++标准库函数。两者都可以使程序结束,但结束的方式有所不同。在C++程序设计中我们会经常用到这些函数。函数exit()将使程序立即并且按顺序结束(按顺序结束意味着正常的程序关闭过程)。如果在程序中发生了一个严重的错误并使得程序的进一步执行无意义或有害时,我们就调用exit,使用exit需要包含头文件<cstdlib.h>,函数的原型为:void exit(int status);因为exit将使程序立即结束,不会返回到调用过程中。因此也就不能有返回值。但是status的值将作为退出代码返回到调用进程中。按照约定,如果status的值是0则表示程序成功结束。任何大于0的值都表明程序是由于某种错误而结束的。可以使用常量EXIT_SUCCESS来指明成功的结束。或者常量EXIT_FAILURE来指明错误的结束。这些常量都定义在头文件<cstdlib.h>zhong 。

      函数abort()的原型为:void abort();与函数exit一样,函数abort也将使程序立即结束。但是与exit函数不同的是,它不会向操作系统的调用者进程返回状态信息,也不会执行一个有序的“程序关闭过程”。使用该函数也需要使用上面的头文件。在实际定义中,函数abort()是一个C++程序“紧急终止”函数。只有在程序中发生了灾难性错误的时候,我们才调用这个函数。

      前面提到过,产生抛出的异常类必须与catch语句中定义的异常类型相匹配。例如下面的程序中如果将catch语句中的异常类型改为double,那么抛出的异常将不会被捕获,从而产生非正常程序终止,代码如下:

 

因为catch不能捕获整数类型的异常,所以程序将被非正常终止。同时,在try块中调用的函数所抛出的异常也可以被try块监控,而被catch语句捕获,示例代码如下:

 

try块可以用在函数中,在这种情况下,每次程序执行到该函数时,与函数相关的异常处理将被复位,示例代码如下:

 

从输出的结果可以看到,在程序中共抛出3个异常,在每次抛出异常之后,函数将返回。当函数被再次调用时,异常处理也将被复位。通常,在每次程序执行到try块时,try将被复位。因此,如果try是循环的一部分,那么在每次循环重复时try都将被复位。

 

 

 

原创粉丝点击