具有不同的异常类

Having different exception classes

本文关键字:异常      更新时间:2023-10-16

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

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

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

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

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