⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter12.htm

📁 为清华大学出版社 C++课后答案
💻 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>第 十二 章 &nbsp;&nbsp;&nbsp;异常处理</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 &lt;iostream.h&gt; </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 &lt;&lt; "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 &lt;&lt; "Number out of range. You used " &lt;&lt; GetNumber() &lt;&lt; " !\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&amp; 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 &lt;&lt; "The number is : " &lt;&lt; *p &lt;&lt; endl;<br>
  delete p;<br>
  }</p>
<p class=style6>void fn3(unsigned int *p)<br>
  {<br>
  long Number;<br>
  cout &lt;&lt; "Enter an integer(0~~1000): ";<br>
  cin &gt;&gt; Number;<br>
  <br>
  if (Number &gt; 1000 || Number &lt; 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 &lt;iostream.h&gt;</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 &lt;&lt; "有异常产生:" &lt;&lt; str &lt;&lt; endl;<br>
  }<br>
  }<br>
</p>
<p class=style5>12-6 定义一个异常类CException,有成员函数Reason(),用来显示异常的类型,定义函数fn1()触发异常,在主函数的try模块中调用fn1(),在catch模块中捕获异常,观察程序的执行流程。</strong><br>
</p>
<p class=style6>解: <br>
  #include &lt;iostream.h&gt;</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&lt;&lt; "在子函数中触发CException类异常" &lt;&lt; endl;<br>
  throw CException();<br>
  }</p>
<p class=style6>void main()<br>
  {<br>
  cout &lt;&lt; "进入主函数" &lt;&lt; endl;<br>
  try<br>
  {<br>
  cout &lt;&lt; "在try模块中,调用子函数" &lt;&lt; endl;<br>
  fn1();<br>
  }<br>
  catch( CException E )<br>
  {<br>
  cout &lt;&lt; "在catch模块中,捕获到CException类型异常:";<br>
  cout &lt;&lt; E.Reason() &lt;&lt; endl;<br>
  }<br>
  catch( char *str )<br>
  {<br>
  cout &lt;&lt; "捕获到其它类型异常:" &lt;&lt; str &lt;&lt; endl;<br>
  }<br>
  cout &lt;&lt; "回到主函数,异常已被处理" &lt;&lt; endl;<br>
  }</p>
<p 
      class=style6>程序运行输出:<br>
  进入主函数<br>
  在try模块中,调用子函数<br>
  在子函数中触发CException类异常<br>
  在catch模块中,捕获到CException类型异常:CException类中的异常。<br>
  回到主函数,异常已被处理</p>
<p class="style2"></p>
<p class="style2">&nbsp;</p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -