第 十二 章 异常处理
12-1 什么叫做异常?什么叫做异常处理?
解:
当一个函数在执行的过程中出现了一些不平常的情况,或运行结果无法定义的情况,使得操作不得不被中断时,我们说出现了异常。异常通常是用throw关键字产生的一个对象,用来表明出现了一些意外的情况。我们在设计程序时,就要充分考虑到各种意外情况,并给与恰当的处理。这就是我们所说的异常处理。
12-2 C++的异常处理机制有何优点?
解:
C++的异常处理机制使得异常的引发和处理不必在同一函数中,这样底层的函数可以着重解决具体问题,而不必过多地考虑对异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。
12-3 举例throw 、try、catch语句的用法?
解:
throw语句用来引发异常,用法为:
throw 表达式;
例如: throw 1.0E-10;
catch语句用来处理某中类型的异常,它跟在一个try程序块后面处理这个try程序块产生的异常,如果一个函数要调用一个可能会引发异常的函数,
并且想在异常真的出现后处理异常,就必须使用try语句来捕获异常。
例如:
try{
语句 //可能会引发多种异常
}
catch(参数声明1)
{
语句 //异常处理程序
}
12-4
设计一个异常Exception抽象类,在此基础上派生一个OutOfMemory类响应内存不足,一个RangeError类响应输入的数不在指定范围内,实现并测试这几个类。
解:
源程序:
#include <iostream.h>
class Exception
{
public:
Exception(){}
virtual ~Exception(){}
virtual void PrintError() = 0;
};
class OutOfMemory : public Exception
{
public:
OutOfMemory(){}
~OutOfMemory(){}
virtual void PrintError();
};
void OutOfMemory::PrintError()
{
cout << “Out of Memory!!\n”;
}
class RangeError : public Exception
{
public:
RangeError(unsigned long number){BadNum = number;}
~RangeError(){}
virtual void PrintError();
virtual unsigned long GetNumber() { return BadNum; }
virtual void SetNumber(unsigned long number) {BadNum = number;}
private:
unsigned long BadNum;
};
void RangeError::PrintError()
{
cout << “Number out of range. You used " << GetNumber() << " !\n”;
}
void fn1();
unsigned int * fn2();
void fn3(unsigned int *);
int main()
{
try
{
fn1();
}
catch (Exception& theException)
{
theException.PrintError();
}
return 0;
}
unsigned int * fn2()
{
unsigned int *n = new unsigned int;
if (n == 0)
throw OutOfMemory();
return n;
}
void fn1()
{
unsigned int *p = fn2();
fn3§;
cout << "The number is : " << *p << endl;
delete p;
}
void fn3(unsigned int *p)
{
long Number;
cout << "Enter an integer(0~~1000): ";
cin >> Number;
if (Number > 1000 || Number < 0)
throw RangeError(Number);
*p = Number;
}
程序运行输出:
Enter an integer(0~1000): 56
The number is : 56
Enter an integer(0~1000): 2000
Number out of range. You used 2000 !
12-5 练习使用try、catch语句,在程序中用new分配内存时,如果操作未成功,则用try语句触发一个字符型异常,用catch语句捕获此异常。
解:
#include <iostream.h>
void main()
{
char *buf;
try
{
buf = new char[512];
if( buf == 0 )
throw “内存分配失败!”;
}
catch( char * str )
{
cout << “有异常产生:” << str << endl;
}
}
12-6
定义一个异常类CException,有成员函数Reason(),用来显示异常的类型,定义函数fn1()触发异常,在主函数的try模块中调用fn1(),在catch模块中捕获异常,观察程序的执行流程。
解:
#include <iostream.h>
class CException
{
public:
CException(){};
~CException(){};
const char *Reason() const { return “CException类中的异常。”; }
};
void fn1()
{
cout<< “在子函数中触发CException类异常” << endl;
throw CException();
}
void main()
{
cout << “进入主函数” << endl;
try
{
cout << “在try模块中,调用子函数” << endl;
fn1();
}
catch( CException E )
{
cout << “在catch模块中,捕获到CException类型异常:”;
cout << E.Reason() << endl;
}
catch( char *str )
{
cout << “捕获到其它类型异常:” << str << endl;
}
cout << “回到主函数,异常已被处理” << endl;
}
程序运行输出:
进入主函数
在try模块中,调用子函数
在子函数中触发CException类异常
在catch模块中,捕获到CException类型异常:CException类中的异常。
回到主函数,异常已被处理