练习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函数不抛出异常。