第9章课后习题

xiaoxiao2021-02-28  27

习题

一、填空题

(1)运行异常,可以   预料   ,但不能避免,它是由    系统运行环境   造成的。

(2)在小型程序开发中,一旦发生异常所采取的方法一般是 将程序立即中断运行,从而无条件释放所有资源  。

(3)C++的异常处理机制使得异常的引发和处理   不必  在同一函数中。

(4)如果预料某段程序(成对某个函数的调用)有可能发生异常,就将它放在     try语句块      中。

(5)如果某段程序中发现了自己不能处理的异常,就可以使用throw<表达式>抛掷这个异常,其中的<表达式>表示 异常类型 。

(6)如果异常类型声明是一个省略号(....),catch子句便处理  任何  类型的异常,这段处理程序必须是catch块的最后一段处理程序。

(7)异常接口声明也称为    抛出列表    ,已经成为函数界面的一部分。

(8)函数原型的抛出列表是一个空表,表示该函数    不抛出     任何类型的异常。

(9)为了使用异常类,需要包含相应的头文件。其中,异常基础类exception定义于  <exception>   中,bad_ alloc定义于      new   中,其他异常类定义于   <stdexcept>    中。

(10)在异常处理程序中发现异常,可以在   catch    语句中用throw语句抛出。

二、选择题(至少选一个,可以多选)(1)处理异常用到3个保留字,除了try外,还有(  AC  )。A. catch                     B. class                    C. throw                      D. return(2) catch.-.)般放在其他catch子句的后面,该子句的作用是( B )。A.拋掷异常                                               B.捕获所有类型的异常C.检测并处理异常                                     D.有语法错误(3)关于异常的描述中,错误的是(  D   )。A.异常既可以被硬件引发,又可以被软件引发B.运行异常可以预料,但不能避免,它是由系统运行环境造成的C.异常是指从发生问题的代码区域传递到处理问题的代码区域的一个对象

D.在程序运行中,一旦发生异常,程序立即中断运行

(4)下列说法中错误的是( CD  )。

 A.引发异常后,首先在引发异常的函数内部寻找异常处理过程

 B.  抛出异常是没有任何危险的

 C.“抛出异常”和“捕捉异常”两种操作最好放在同一个函数中

 D.异常处理过程在处理完异常后,可以通过带有参数的throw继续传播异常

三、判断题

(1) try与catch总是结合使用的。                                     ( 对 )

(2)一个异常可以是除类以外的任何类型。                              ( 错 )

(3)抛出异常后一定要马上终止程序。                                  ( 错 )

(4)异常接口定义的异常参数表为空,表示可以引发任何类型的异常。      ( 错 )

(5)C++标准库中不需要异常类,因为C++标准库中很少发生异常。           ( 错 )

(6)异常处理程序捕获到异常后,必须马上处理。                        ( 错 )
(7)一个异常只能在catch语句中再用throw语句抛出。                    ( 对 )
(8)当catch子句的异常类型声明参数被初始化后,将从对应的try块开始到异常被抛那处之间构造(且尚未析构)的所有自动对象进行析构。                                                         ( 对 )
四、简答题 (1)什么叫异常处理? 答:异常处理是一种程序定义的错误,它对程序的逻辑错误进行设防,并对运行异常加以控制。在C++中,异常处理是对所能预料的运行错误进行处理的一套实现机制。(2)C++的异常处理机制有何优点? 答:C++的异常处理机制使得异常的引发和处理不必在同一函数中。C++异常处理的目的是在异常发生时,尽可能地减小破坏,周密地善后,而不影响其他部分程序的运行。这样底层的函数可以着重解决具体问题,而不必过多地考虑对异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理,这在大型程序中是非常必要的。

五、程序分析题(分析程序,写出程序的输出结果)

#include<iostream> using namespace std; class Nomilk { public: Nomilk(); Nomilk(int how_many); int get_money(); private: int count; }; int main() { int money,milk; double dpg; try { cout<<"Enter nunber of money;"; cin>>money; cout<<"Enter nunber of glasses of milk:"; cin>>milk; if(milk <=0) throw Nomilk(money); dpg= money/double(milk); cout<< money<<"yuan"<< endl<<milk<<" glasses of milk."<< endl<<"You have"<<dpg<<"yuan for each glass of milk."<< endl; } catch(Nomilk e) { cout<<e.get_money()<<"yuan,and No Mike!"<<endl<<"Go buy some milk."<<endl; } cout<<"End of program."<<endl; return 0; } Nomilk::Nomilk() {} Nomilk::Nomilk(int how_many):count(how_many) {} int Nomilk::get_money() { return count; } 写出当分别输人 4   2和 4   0 两组数后的输出结果。

分析:程序首先定义了Nomilk类,类中有一个有参构造和一个无参构造,还有一个成员函数。主函数中一个整型的money和milk,还有一个double型的dpg,try语句块中前4句输出第1、2 行结果,当milk<=0时抛出异常。如果milk>0接着执行下面的语句,若milk<=0抛出异常,直接跳到用catch语句捕获异常并处理异常,就执行catch里面的语句,输出后面的结果。

六、程序设计题 从健盘上输人x的值,并计算y =ln(2x+ 1)的值,要求用异常处理“负数求对数”的情况。 //xt9_1.cpp #include <iostream> #include <cmath> using namespace std; class Cln { public: Cln(double x); double get_y(); private: double y; }; int main() { double x,y,z; try { cout<< "Enter a double number:"; cin>>x; y=2*x+1; if(y<0) throw Cln(y); z=log(y); cout<<"y=ln("<<2*x+1<<")="<<z<<endl; } catch(Cln e) { cout<<e.get_y()<<": 负数求对数"<<endl; } cout<<"End of program."<<endl; return 0; } Cln::Cln(double x): y(x) {} double Cln::get_y() { return y; } 程序输出结果如下:

转载请注明原文地址: https://www.6miu.com/read-2614137.html

最新回复(0)