"《C++ Primer Plus》第三版中文版,由Stanley B. Lippman和Josée Lajoie合著,潘爱民、张丽译,是中国电力出版社出版的书籍。本书深入介绍了C++语言,涵盖了C++的基础知识到高级特性,包括异常处理、类模板等内容,并强调了C++标准的重要性。"
在C++编程中,异常处理是一种关键的错误处理机制,用于捕获和处理程序执行期间可能出现的错误。异常是在程序执行过程中抛出的特殊信号,通常用来表示非正常或预期之外的情况。C++标准库定义了一系列的预定义异常类,这些异常类是继承自`exception`类的,帮助程序员更准确地报告和处理不同类型的错误。
1. `domain_error`: 这个异常类用于报告函数接收到了无效的参数,即参数不在其预期的定义域内。例如,当数学运算中使用了不适用的数值时,可能会抛出`domain_error`。
2. `runtime_error`: 是所有运行时错误的基础类,它本身继承自`exception`。当程序在运行时遇到不可预期的问题时,可以抛出`runtime_error`。例如,如果函数的内部计算超出了预定范围,可以抛出`range_error`。
3. `range_error`: 表示一个值超出了其预期的范围。这通常发生在数组索引越界、计算结果超出预期范围等场景。例如,当尝试访问`Array`类模板的元素时,如果索引值不合法,可以抛出`out_of_range`异常。
4. `overflow_error`和`underflow_error`: 这两者都是`runtime_error`的子类,分别用于报告算术溢出和算术下溢的错误。溢出错误发生在数值运算结果过大,超过了数据类型能表示的最大值;下溢则发生在数值运算结果过小,低于数据类型能表示的最小正值。
5. `bad_alloc`: 当使用`new`操作符尝试分配内存但失败时,如内存不足,会抛出`bad_alloc`异常。这是`exception`类的一个子类,确保内存管理的异常处理。
6. `bad_cast`: 在动态类型转换(如`dynamic_cast`)失败时,程序会抛出`bad_cast`异常。`bad_cast`也继承自`exception`,它用于类型安全的向下转型失败时的错误报告。
在C++中,异常处理通常涉及`try`、`catch`和`throw`关键字。程序员可以在可能出错的代码块周围使用`try`,然后定义一个或多个`catch`块来捕获并处理特定类型的异常。`throw`语句用于抛出异常,可以是任何类型的对象,但通常使用预定义的异常类或者自定义异常类。
例如,对于`Array`类模板,可以重定义`operator[]()`,当索引值越界时,抛出`std::out_of_range`异常,以提供更好的错误信息和程序的健壮性:
```cpp
#include <stdexcept>
#include <string>
template <class elemType>
class Array {
public:
// ...
elemType& operator[](int ix) const {
if (ix < 0 || ix >= _size) {
throw std::out_of_range("Array index out of bounds");
}
// 正常访问数组元素的代码...
}
};
```
通过这样的异常处理,程序员可以编写更加健壮的代码,避免因错误处理不当而导致程序崩溃。C++的异常处理机制使得错误能够被及时捕获并采取适当的措施,提高了程序的可靠性。