1.12 练习
1-1 编写三个函数:一个通过返回错误值来指出错误情况,一个设置errno标志,最后一个使用signal()。编写代码调用这些函数并响应产生的错误。编写第4个函数,这个函数抛出异常。调用这个函数并捕获异常。描述这4种方法的区别,为什么说异常处理机制是一种更好的方法。
1-2 创建一个类,这个类含有抛出异常的成员函数。在这个类中嵌套一个类作为异常对象的类型。这个异常类使用一个const char*作为参数;这个参数代表一个描述字符串。创建一个抛出这种异常的成员函数。(在函数的异常规格说明中描述这种异常。)编写一个try块调用这个成员函数,写一个catch子句通过显示描述字符串的方式处理这个异常。
1-3 重新编写第1卷第13章中的Stash类,为operator[]抛出out_of_range异常。
1-4 编写一个普通的main()函数,捕获所有的异常并报告错误。
1-5 创建一个类,这个类带有自己的new运算符。这个运算符为十个对象分配内存,并且在为第11个对象分配内存时抛出“run out of memory”(内存用完)异常。并且添加一个静态成员函数用于回收这个内存。创建main()函数,其中包含try块和catch子句,在catch子句中调用回收内存的子例程。把这些代码放在一个while循环中,用于演示从异常恢复并继续执行的过程。
1-6 创建一个抛出异常的析构函数,编写代码来为自己证明这是一个坏主意。(在能够捕获现有异常的异常处理器被调用之前,如果一个新的异常被抛出,会调用terminate()。)
1-7 证明所有异常对象(被抛出的异常对象)都会被正确销毁。
1-8 证明如果我们在堆上创建一个异常对象,并且抛出指向这个对象的指针,那么这个对象不会被清理。
1-9 编写一个带有异常规格说明的函数,这个函数能够抛出4种异常:一个char、一个int、一个bool和一个自己的异常类。在main()函数中捕获每种异常,并且验证这些捕获的异常。从标准异常类派生自己的异常类。使用下述方法编写main()函数:系统从异常中恢复并尝试重新执行抛出异常的函数。
1-10 修改上一个练习,让函数抛出一个违反异常规格说明的double类型的异常。在自己的unexpected处理函数中捕获这个违反异常规格说明的错误,显示一个消息然后优雅地退出程序(也就是说不要调用abort())。
1-11 编写一个Garage类,这个类包含一个Car,这个Car的Motor出了故障。在Garage类的构造函数中使用函数级try块用于捕获Car对象初始化时抛出的异常(从Motor类抛出的异常)。从Garage类构造函数的异常处理器中抛出一个不同的异常,并在main()函数中捕获这个异常。