一、填空题
(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++标准库中很少发生异常。 ( 错 )
五、程序分析题(分析程序,写出程序的输出结果)
#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; } 程序输出结果如下: