一、填空题
(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外,还有( A C )。
A. catch B. class C. throw D. return
(2) catch.-.)般放在其他catch子句的后面,该子句的作用是( B )。
A.拋掷异常 B.捕获所有类型的异常
C.检测并处理异常 D.有语法错误
(3)关于异常的描述中,错误的是( D )。
A.异常既可以被硬件引发,又可以被软件引发
B.运行异常可以预料,但不能避免,它是由系统运行环境造成的
C.异常是指从发生问题的代码区域传递到处理问题的代码区域的一个对象
D.在程序运行中,一旦发生异常,程序立即中断运行
(4)下列说法中错误的是( C D )。
A.引发异常后,首先在引发异常的函数内部寻找异常处理过程
B. 抛出异常是没有任何危险的
C.“抛出异常”和“捕捉异常”两种操作最好放在同一个函数中
D.异常处理过程在处理完异常后,可以通过带有参数的throw继续传播异常
三、判断题
(1) try与catch总是结合使用的。 (对)
(2)一个异常可以是除类以外的任何类型。(错)
(3)抛出异常后一定要马上终止程序。 (错)
(4)异常接口定义的异常参数表为空,表示可以引发任何类型的异常。 (错)
(5)C++标准库中不需要异常类,因为C++标准库中很少发生异常。(错)
(6)异常处理程序捕获到异常后,必须马上处理。 (错)
(7)一个异常只能在catch语句中再用throw语句抛出。 (错)
(8)当catch子句的异常类型声明参数被初始化后,将从对应的try块开始到异常被抛那处之间构造(且尚未析构)的所有自动对象进行析构。(对)
四、简答题
(1)什么叫异常处理?
答:异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。 异常处理(又称为错误处理)功能提供了处理程序运行时出现的任何意外或异常情况的方法。异常处理使用 try、catch 和 finally 关键字来尝试可能未成功的操作,处理失败,以及在事后清理资源。
异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。
通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃
(2)C++的异常处理机制有何优点?
答:异常处理是运行错误的良好方法。某个库软件或者你的代码提供了一个机制,能在出现异常情况时发出信号,则称为抛出异常。在程序的另一个地方,需要添加合适的代码来处理异常情况,称为处理异常。它使得在异常的引发和处理不必在同一函数中。异常处理的目的是在异常发生时,尽可能的减小破坏,周密的善后,而不影响其他部分程序的运行。
五、程序分析题(分析程序,写出程序的输出结果)
1. using namespace std;
2. class Nomilk
3. {
4. public:
5. Nomilk();
6. Nomilk(int how_many);
7. int get_money();
8. private:
9. int count;
10. };
11.
12. int main()
13. {
14. int money,milk;
15. double dpg;
16. try
17. {
18. cout<<"Enter nunber of money;";
19. cin>>money;
20. cout<<"Enter nunber of glasses of milk:";
21. cin>>milk;
22. if(milk <=0)
23. throw Nomilk(money);
24. dpg= money/double(milk);
25. cout<< money<<"yuan"<< endl<<milk<<" glasses of milk."<< endl<<"You have"<<dpg<<"yuan for each glass of milk."<< endl;
26. }
27. catch(Nomilk e)
28. {
29. cout<<e.get_money()<<"yuan,and No Mike!"<<endl<<"Go buy some milk."<<endl;
30. }
31. cout<<"End of program."<<endl;
32. return 0;
33. }
34. Nomilk::Nomilk()
35. {}
36. Nomilk::Nomilk(int how_many):count(how_many)
37. {}
38. int Nomilk::get_money()
39. {
40. return count;
41. }
写出当分别输人 4 2 和 4 0 两组数后的输出结果。
六、程序设计题
从健盘上输人x的值,并计算y =ln(2x+ 1)的值,要求用异常处理”负数求对数”的情况。
1. #include <iostream>
2. #include <cmath>
3. using namespace std;
4. class Cln
5. {
6. public:
7. Cln(double x);
8. double get_y();
9. private:
10. double y;
11. };
1. int main()
2. {
3. double x,y,z;
4. try
5. {
6. cout<< "Enter a double number:";
7. cin>>x;
8. y=2*x+1;
9. if(y<0)
10. throw Cln(y);
11. z=log(y);
12. cout<<"y=ln("<<2*x+1<<")="<<z<<endl;
13. }
14. catch(Cln e)
15. {
16. cout<<e.get_y()<<": 负数求对数"<<endl;
17. }
18. cout<<"End of program."<<endl;
19. return 0;
20. }
21. Cln::Cln(double x): y(x)
22. {}
23. double Cln::get_y()
24. {
25. return y;
26. }
运行结果: