📄 chapter12.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
<style type="text/css">
<!--
.style4 {
font-size: 16px;
color: #FF0000;
}
.style5 {
font-size: 14px;
font-weight: bold;
}
.style6 {font-size: 14px}
-->
</style>
</head>
<body>
<p><span
class=style4><em><strong>第 十二 章 异常处理</strong></em></span><br>
</p>
<p><span class="style5">12-1 什么叫做异常?什么叫做异常处理?</span><br>
</span></span></p>
<p><span class="style6">解: <br>
当一个函数在执行的过程中出现了一些不平常的情况,或运行结果无法定义的情况,使得操作不得不被中断时,我们说出现了异常。异常通常是用throw关键字产生的一个对象,用来表明出现了一些意外的情况。我们在设计程序时,就要充分考虑到各种意外情况,并给与恰当的处理。这就是我们所说的异常处理。</span><br>
</span></p>
<p><span class="style5">12-2 C++的异常处理机制有何优点?<br>
</span></p>
<p><span class="style6">解: <br>
C++的异常处理机制使得异常的引发和处理不必在同一函数中,这样底层的函数可以着重解决具体问题,而不必过多地考虑对异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。<br>
</span></p>
<p><span class="style5">12-3 举例throw 、try、catch语句的用法?<br>
</span></p>
<p><span class="style6">解: <br>
throw语句用来引发异常,用法为:<br>
throw 表达式;<br>
例如: throw 1.0E-10;<br>
catch语句用来处理某中类型的异常,它跟在一个try程序块后面处理这个try程序块产生的异常,如果一个函数要调用一个可能会引发异常的函数, 并且想在异常真的出现后处理异常,就必须使用try语句来捕获异常。<br>
例如:<br>
try{<br>
语句 //可能会引发多种异常<br>
}<br>
catch(参数声明1)<br>
{<br>
语句 //异常处理程序<br>
}<br>
</span></p>
<p><span class="style6"><strong>12-4 设计一个异常Exception抽象类,在此基础上派生一个OutOfMemory类响应内存不足,一个RangeError类响应输入的数不在指定范围内,实现并测试这几个类。</strong><br>
</span></p>
<p><span class="style6">解: <br>
源程序:<br>
#include <iostream.h> </span></p>
<p class=style6>class Exception<br>
{<br>
public:<br>
Exception(){}<br>
virtual ~Exception(){}<br>
virtual void PrintError() = 0;<br>
};</p>
<p class=style6>class OutOfMemory : public Exception<br>
{<br>
public:<br>
OutOfMemory(){}<br>
~OutOfMemory(){}<br>
virtual void PrintError();<br>
};</p>
<p class=style6>void OutOfMemory::PrintError()<br>
{<br>
cout << "Out of Memory!!\n";<br>
}</p>
<p class=style6>class RangeError : public Exception<br>
{<br>
public:<br>
RangeError(unsigned long number){BadNum = number;}<br>
~RangeError(){}<br>
virtual void PrintError();<br>
virtual unsigned long GetNumber() { return BadNum; }<br>
virtual void SetNumber(unsigned long number) {BadNum = number;}<br>
private:<br>
unsigned long BadNum;<br>
};</p>
<p class=style6>void RangeError::PrintError()<br>
{<br>
cout << "Number out of range. You used " << GetNumber() << " !\n";<br>
}</p>
<p class=style6><br>
void fn1();<br>
unsigned int * fn2();<br>
void fn3(unsigned int *);</p>
<p class=style6>int main()<br>
{<br>
try<br>
{<br>
fn1();<br>
}<br>
<br>
catch (Exception& theException)<br>
{<br>
theException.PrintError();<br>
}<br>
return 0;<br>
}</p>
<p class=style6>unsigned int * fn2()<br>
{<br>
unsigned int *n = new unsigned int;<br>
if (n == 0)<br>
throw OutOfMemory();<br>
return n;<br>
}</p>
<p class=style6>void fn1()<br>
{<br>
unsigned int *p = fn2();<br>
<br>
fn3(p);<br>
cout << "The number is : " << *p << endl;<br>
delete p;<br>
}</p>
<p class=style6>void fn3(unsigned int *p)<br>
{<br>
long Number;<br>
cout << "Enter an integer(0~~1000): ";<br>
cin >> Number;<br>
<br>
if (Number > 1000 || Number < 0)<br>
throw RangeError(Number);<br>
*p = Number;<br>
}</p>
<p class=style6>程序运行输出:<br>
Enter an integer(0~~1000): 56<br>
The number is : 56<br>
Enter an integer(0~~1000): 2000<br>
Number out of range. You used 2000 !</p>
<p class=style6><br>
</p>
<p class=style5>12-5 练习使用try、catch语句,在程序中用new分配内存时,如果操作未成功,则用try语句触发一个字符型异常,用catch语句捕获此异常。</strong><br>
</p>
<p class=style6>解: <br>
#include <iostream.h></p>
<p class=style6>void main()<br>
{<br>
char *buf;<br>
try<br>
{<br>
buf = new char[512];<br>
if( buf == 0 )<br>
throw "内存分配失败!";<br>
}<br>
catch( char * str )<br>
{<br>
cout << "有异常产生:" << str << endl;<br>
}<br>
}<br>
</p>
<p class=style5>12-6 定义一个异常类CException,有成员函数Reason(),用来显示异常的类型,定义函数fn1()触发异常,在主函数的try模块中调用fn1(),在catch模块中捕获异常,观察程序的执行流程。</strong><br>
</p>
<p class=style6>解: <br>
#include <iostream.h></p>
<p class=style6>class CException<br>
{<br>
public:<br>
CException(){};<br>
~CException(){};<br>
const char *Reason() const { return "CException类中的异常。"; }<br>
<br>
};</p>
<p class=style6>void fn1()<br>
{<br>
cout<< "在子函数中触发CException类异常" << endl;<br>
throw CException();<br>
}</p>
<p class=style6>void main()<br>
{<br>
cout << "进入主函数" << endl;<br>
try<br>
{<br>
cout << "在try模块中,调用子函数" << endl;<br>
fn1();<br>
}<br>
catch( CException E )<br>
{<br>
cout << "在catch模块中,捕获到CException类型异常:";<br>
cout << E.Reason() << endl;<br>
}<br>
catch( char *str )<br>
{<br>
cout << "捕获到其它类型异常:" << str << endl;<br>
}<br>
cout << "回到主函数,异常已被处理" << endl;<br>
}</p>
<p
class=style6>程序运行输出:<br>
进入主函数<br>
在try模块中,调用子函数<br>
在子函数中触发CException类异常<br>
在catch模块中,捕获到CException类型异常:CException类中的异常。<br>
回到主函数,异常已被处理</p>
<p class="style2"></p>
<p class="style2"> </p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -