让我们重新考虑Vector的例子。对2.3节中的向量,当我们试图访问某个越界的元素时,应该做什么呢?
Vector的作者并不知道使用者在面临这种情况时希望如何处理(通常情况下,Vector的作者甚至不知道向量被用在何种程序场景中)。
Vector的使用者不能保证每次都检测到问题(如果他们能做到的话,越界访问也就不会发生了)。
因此最佳的解决方案是由Vector的实现者负责检测可能的越界访问并通知使用者,然后Vector的使用者可以采取适当的应对措施。例如,Vector::operator[]()能够检测到潜在的越界访问错误并抛出一个out_of_range异常:

throw负责把程序的控制权从某个直接或间接调用了Vector::operator[]()的函数转移到out_of_range异常处理代码。为了实现这一目标,实现部分需要解开(unwind)函数调用栈以便返回主调函数的上下文。换句话说,异常处理机制把程序的控制权从当前作用域转移到处理该类型错误的代码,在必要的时候调用析构函数(见4.2.2节)。例如:

我们把可能发生异常的可疑程序放在一个try块当中。显然,对v[v.size()]的赋值操作将会出错。因此,程序进入到提供了out_of_range错误处理代码的catch从句中。
out_of_range类型定义在标准库中(在<stdexcept>中),事实上,一些标准库容器访问函数也使用它。
通过使用异常处理机制,错误处理变得更简单,条理性和可读性也得到了加强。但是也要注意不能过度使用try语句。4.2.2节进一步介绍一些技术——称为资源请求即初始化(Resource Aquisition Is Initialization),这些技术使得错误处理简单易用,具有较好的系统性。
我们可以把一个永远不会抛出异常的函数声明成noexcept。例如:

一旦真的发生了错误,函数user()还是会抛出异常,此时标准库函数terminate()立即终止当前程序的执行。