0

我有一个关于异常的简单问题。为什么人们经常为每种类型的异常使用单独的类,是因为我们可能希望以不同的方式处理不同的异常吗?(例如,与仅捕获“...”相比)。

4

2 回答 2

4

异常对象不仅用于指示发生了某事,因此catch (...)将是使用异常功能的一种非常原始的方式。

每个异常对象通常都会携带一个“有效载荷”:从异常发生的地方到处理它的地方的信息。当异常向上展开调用堆栈时,沿途的函数可能会拦截它,用额外的信息丰富它,然后将其发送到更远的地方。程序中的不同功能模块将向异常处理程序发送完全不同的信息,这就是为什么您需要不同的异常类来携带该信息。

例如,解析器异常可能携带有关行号和语法错误性质的信息。文件系统异常可能携带有关文件名和错误代码的信息。动态内存异常可能携带有关特定内存操作和内存块大小的信息。等等。要存储和携带那些完全不相关的数据集,您通常需要定义不同的异常类型。

于 2013-07-08T06:25:55.673 回答
0

除了在特殊情况下提供不同的数据以及处理不同错误的不同方式之外,您还可以决定在不同的地方处理它们。考虑一个loadFileContentIntoMemory可能由于文件系统错误(访问权限、未找到文件等)和内存问题(通常是std::bad_alloc)而引发错误的函数。您可能希望处理一种错误,而无法同时处理另一种错误。例如,您可能想捕获与文件相关的错误并尝试使用另一个文件名,而通常很难bad_alloc在程序的任何位置做任何事情,因此许多程序在最高级别的位置捕获它以发出错误消息并终止该程序。

于 2013-07-08T06:55:33.503 回答