C++Primer18.1.5节练习

文章展示了C++中如何创建自定义异常类,如`out_of_stock`和`isbn_mismatch`,这些类继承自标准库的错误类型。在`Sales_data`类的复合赋值运算符中,如果ISBN不匹配,会抛出`isbn_mismatch`异常。此外,文章还演示了异常处理的加法运算符重载版本,当异常发生时,捕获并打印错误信息,而未处理的异常会导致程序终止。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学C++.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值