C++异常处理:从基础到派生类异常

需积分: 48 185 下载量 62 浏览量 更新于2024-08-10 收藏 4.41MB PDF 举报
"《C++ Primer Plus》第三版,作者:Stanley B. Lippman和Josée Lajoie,中文版,由中国电力出版社出版。本书深入探讨C++语言,涵盖了C++的最新标准,旨在帮助读者全面理解并掌握C++语言。" 在C++编程中,异常处理是一个关键的概念,它允许程序在遇到错误或特殊情况时进行优雅的恢复。在标题提及的《算法设计 jon_kleinberg英文原版》中,虽然没有直接内容,但我们可以根据描述来讨论C++中异常处理的相关知识。 在C++中,`throw`表达式用于抛出一个异常。在描述的代码段中,当栈满(`full()`)时,尝试调用`pushOnFull`函数,并抛出一个异常。这里的`throw *pse`创建了一个异常对象,其类型为`stackExcp`。值得注意的是,即使`pse`实际上指向的是`pushOnFull`类型的对象,异常对象的类型也不会改变,这意味着这个异常不能被`pushOnFull`类型的`catch`子句处理。 异常处理的规则指出,`throw`表达式所创建的异常对象必须是能够通过一个构造函数从抛出的对象类型转换得到的。如果`pushOnFull`类没有接受`int`参数的构造函数,或者这样的构造函数不可访问,或者`pushOnFull`类的拷贝构造函数或析构函数不可访问,那么`throw`表达式将导致错误。此外,如果`pushOnFull`是抽象基类,由于不能创建抽象类的对象,`throw`也会引发问题。 在处理类类型的异常时,C++支持异常继承层次结构。就像描述中的例子所示,`pushOnFull`类型的异常可以被其基类`stackExcp`或更基类`Excp`的`catch`子句捕获。然而,`catch`子句的顺序至关重要,因为它们按照在`try`块后面的顺序进行匹配。一旦一个异常被一个`catch`子句捕获,后续的`catch`子句将不再检查。因此,派生类类型的`catch`子句应当先于基类类型的`catch`子句出现,以确保更特定的异常处理先执行。 在给出的示例中,最初的`catch (Excp)`子句会捕获所有`Excp`及其派生类的异常,包括`pushOnFull`,导致专门为`pushOnFull`定义的`catch`子句无法执行。正确的顺序应该是首先处理`pushOnFull`,然后处理更通用的`Excp`异常。 C++的异常处理机制提供了一种结构化的方式来处理程序运行时可能遇到的错误。正确理解和使用`throw`、`catch`以及异常层次结构对于编写健壮的C++代码至关重要。