9.6 本章习题

9.6 本章习题

一、填空题

1.C++中,抛出异常的关键字是_throw__。
2.C++标准异常库以 exception___类为根基类。
3.C++标准异常类中,runtime_error 类表示运行时异常 。
4. 在C++中,宏定义 static_assert 表示静态断言。

二、判断题

1.try…catch语句中可以有多个try语句。(× )
2.try…catch语句可以分开,单独使用。(× )
3.try语句块中代码抛出异常后,如果异常被正确处理,抛出异常代码后面的程序会继续执行。(√ )
4.栈解旋会把try语句块中的所有对象都释放,包括堆内存上的对象。(
栈解旋是指发生异常时,程序会回溯到调用该函数的地方,释放掉该函数中所有局部对象的空间。即用new申请的堆内存,也被释放掉。
5.C++标准异常类都定义了what()函数,用于描述异常信息。(
C++标准异常类定义what()函数,用于描述异常信息。是虚函数,被派生类所重载,用于返回异常的描述信息。 try 块中抛出异常,catch捕获该异常,调用其what()函数获取异常信息。
6.使用静态断言,程序可以在编译时检测错误。(√ )

三、选择题

1.关于函数声明“float func(int a,int b)throw;”,下列描述中正确的是(C )。
A.表明函数抛出float类型异常
B.表明函数可抛出任何类型异常
C.表明函数不抛出任何类型异常
D.表明函数可能抛出异常

2.关于C++异常处理的流程,下列说法中错误的是(B)。
A.对某段可能产生异常的代码或函数使用try结构进行检测
B.如果在执行try结构期间没有引起异常,则跟在try后面的catch结构不会执行
执行try结构期间没有引起异常,后面的catch结构仍会执行,但不会处理任何异常。
C.如果在执行try结构期间发生异常,在异常发生的位置使用throw抛出异常,一个异常对象将被创建
D.本层try语句抛出了异常,只能由本层的catch语句处理

3.关于栈解旋,下列说法中正确的是(C )。
A.栈解旋时,对象的析构顺序与构造顺序相同
B.栈解旋只能释放栈上的对象
C.栈解旋可以释放堆上的对象
D.try语句块之外的对象也可以通过栈解旋释放

4.关于标准库异常,下列说法中错误的是(D )。
A.logic_error类表示那些可以在程序中被预先检测到的异常
B.异常基类exception定义在头文件exception中
C.exception类接口中的函数都有一个noexcept关键字,这表示exception类成员函数不会抛出任何异常
D.runtim e_error类不能被继承

5.关于断言,下列说法中错误的是( D)。
A.断言是调试程序的一种手段
B.static_assert是静态断言,即在程序编译时期检测错误
C.宏assert()用来在运行阶段实现断言
D.static_assert可以使用变量作为参数
static_asssert静态断言可以使用常量表达式作为参数,不能使用变量。 静态断言的参数必须在编译阶段就确定其值, 变量的值只有在程序运行时才能确定。

四、简答题

1.简述C++中的异常处理过程。

异常处理: 处理程序在运行时发生的错误的机制

  1. 程序中抛出异常的代码块, 使用try语句将其包裹起来
  2. try中某个地方发生异常,程序跳转到后面catch 匹配类型。没有匹配的catch语句,程序终止,打印错误信息。
  3. catch语句捕获到异常,处理完成后,程序继续执行catch后面的代码
  4. 在catch语句中抛出新的异常,异常继续向外抛,直到找到匹配的catch语句。否则停止并打印错误信息
    C++中,异常可以是任何类型的数据,但通过我们使用标准库中的异常类表示不同类型的异常。其中异常类都继承自std::execption, 并提供what()函数返回异常的描述信息。开发者也可以自定义异常类,只需继承自std::exception并重载what()函数。
    2.简述static_assert与assert的区别。
    静态断言可以在未运行程序前发现异常(编译时断言), assert宏只能在程序运行时期执行,意味着不运行程序无法检测到断言错误。

五、编程题

请按照下列要求编写程序。

(1)定义一个异常类Cexception,有成员函数reason(),用来显示异常的类型。

//使用以下代码定义一个名为Cexception的异常类,
//并包含一个reason()成员函数来显示异常类型:
#include<iostream>
#include<exception>

class Cexception: public std::exception 
{
public:
    //构造函数, 接受一个字符串表示异常类型
    explicit Cexception(const std::string& exception_type)
    :type(exception_type){    }
    //reason()成员函数,用于显示异常类型
    void reason() const
    {
        std::cout<<"异常类型:"<<type<<std::endl;
    }
private:
    std::string type; //存储异常类型的私有函数
};
int main()
{
    try
    {
        //抛出异常并传递异常类型
        throw Cexception("自定义异常");
    }
    catch(const Cexception& e)
    {
        //捕获异常,调用reason显示异常类型
        e.reason();
    }
    return 0;
}

(2)定义一个函数fun()触发异常,在主函数try语句块中调用fun(),在catch语句块中捕获异常,观察程序执行流程。

#include<iostream>
using namespace std;
void func()
{
    cout<<"触发异常"<<endl;
    throw "自定义异常信息";
}
int main()
{
    try{
        func();
    }
    catch(const char *msg)
    {
        cout<<"捕获到异常:"<<msg<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值