August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
让我们重新考虑Vector的例子。对2.3节中的向量,当我们试图访问某个越界的元素时,应该发生什么呢?
·Vector的编写者并不知道使用者在面临这种情况时希望如何处理(通常情况下,Vector的编写者甚至不知道向量被用在何种程序中)。
·Vector的使用者不能保证每次都检测到问题(如果他们能做到的话,越界访问也就不会发生了)。
假设越界访问是一种错误,我们希望能从中恢复,合理的解决方案是由Vector的实现者检测意图越界的访问并通知使用者,然后使用者可以采取适当的应对措施。例如,Vector::operator[]()能够检测到意图越界的访问,并抛出一个out_of_range异常:
throw将程序的控制权从某个直接或间接调用Vector::operator[]()的函数转移到out_of_range异常处理代码。为此,C++实现需能展开(unwind)函数调用栈以便返回调用者的上下文。换句话说,异常处理机制会退出一系列作用域和函数以便回到对处理这种异常表达出兴趣的某个调用者,一路上会按需要调用析构函数(参见4.2.2节)。例如:
如果希望处理某段代码的异常,应将其放在一个try块中。显然,对v[v.size()]的赋值操作将会出错。因此,程序进入到catch子句中,它提供了out_of_range类型错误的处理代码。out_of_range类型定义在标准库中(在<stdexcept>中),事实上,它也被一些标准库容器访问函数使用。 ...
Read now
Unlock full access