第十八章 18.1.5节练习

练习18.9

定义本书描述的书店程序异常类,然后为Sales_data类重新编写一个符合赋值运算符并令其抛出一个异常。

解答:

具体的运算符编写参考书中实现。

可以用两个ISBN编号不同的Sales_data类实例来进行+=的运算,来触发异常。


练习18.10

编写程序令其对两个ISBN编号不相同的对象执行Sales_data的加法运算。为给程序编写两个不同的版本:一个处理异常,一个不处理异常。观察并比较这两个程序的行为,用心体会当出现一个未被捕获的异常时程序会发生什么情况。

解答:

#include <iostream>
#include <string>
#include <stdexcept>

using namespace std;

class isbn_mismatch :public logic_error{
public:
	explicit isbn_mismatch(const string &s) :logic_error(s){}
	isbn_mismatch(const string &s, const string &lhs, const string &rhs) :
		logic_error(s), left(lhs), right(rhs){}
	const string left, right;
};

class test{
public:
	test& operator+=(const test& r);
	test(string is, int n) :isbn(is), num(n){}
	string isbn;
	int num;
};

test& test::operator+=(const test& r){
	if (isbn != r.isbn){
		throw isbn_mismatch("wrong isbns", isbn, r.isbn);
	}
	num += r.num;
	return *this;
}

#define HANDLE 0

int main(){
	test a("5s", 5), b("6plus", 6);
#if HANDLE
	try{
#endif
		a += b;
#if HANDLE
	}
	catch (const isbn_mismatch& e){
		cerr << e.what() << ": left isbn(" << e.left
			<< ") right isbn(" << e.right << ")" << endl;
	}
#endif
}
这里写了简单的实现来等价书店类的操作。

这里用HANDLE宏作为开关,来选择是处理还是不处理异常。

当异常被妥善处理,程序是能够正常运行的,而异常没有被处理,程序将会终止。

【引用】一个异常如果没有被捕获,则他将终止当前的程序。


练习18.11

为什么what函数不应该抛出异常?

解答:

what函数是负责返回用于初始化异常对象的信息的函数。所以,它也是属于异常处理的一个环节。

当处理异常的环节,再发生异常,则会更加难以处理,所以这里需要what函数不抛出异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值