练习18.9:
书上代码:
书店程序异常类
#include <iostream>
#include <vector>
#include <list>
using namespace std;
class out_of_stock :public std::runtime_error
{
public:
explicit out_of_stock(const std::string& s) :
std::runtime_error(s) {}
};
class isbn_mismatch :public std::logic_error
{
public:
explicit isbn_mismatch(const std::string& s) :std::logic_error(s) { }
isbn_mismatch(const std::string& s,
const std::string& lhs, const std::string& rhs):
std::logic_error(s), left(lhs), right(rhs) { }
const std::string left, right;
};
int main()
{
system("pause");
return 0;
}
复合赋值运算符
Sales_data&
Sales_data::operator+=(const Sales_data& rhs)
{
if (isbn() != rhs.isbn())
throw isbn_mismatch("wrong isbns", isbn(), rhs.isbn());
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
练习18.10:
在加法运算符中加入异常类对象得到处理异常的加法版本
//重载的加法运算符
Sales_date operator+(const Sales_date& lhs, const Sales_date& rhs)
{
Sales_date tmp;
if (lhs.isbn() != rhs.isbn())
throw isbn_mismatch("wrong isbn", lhs.isbn(), rhs.isbn());
tmp = lhs;
tmp += rhs;
return tmp;
}
处理异常:
//测试
int main()
{
Sales_date s1("Machine Learnig", 20, 10);
Sales_date s2("Deep Learnig", 50, 10);
try {
Sales_date sumTemp = s1 + s2;
cout << sumTemp << endl;
}
catch(const isbn_mismatch& e) {
cerr << e.what() << endl;
}
system("pause");
return 0;
}
结果:
不处理异常:
//测试
int main()
{
Sales_date s1("Machine Learnig", 20, 10);
Sales_date s2("Deep Learnig", 50, 10);
Sales_date sumTemp = s1 + s2;
cout << sumTemp << endl;
system("pause");
return 0;
}
结果:出现错误
抛出throw未经处理,编译器调用terminal终止程序
练习18.11:
what是一个虚函数,用来在catch异常后提取异常信息。每一个异常类都会继承这个函数。如果what函数抛出异常,那在新的异常类依旧会抛出异常,无限循环,所以what函数不应该抛出异常