我有一个关于例外的简单问题。为什么人们经常为每种类型的异常使用单独的类,是因为我们可能希望以不同的方式处理不同的异常? (与仅捕捉“......”相比)。
答案 0 :(得分:4)
异常对象不只是用于指示发生的事情,因此catch (...)
将是一种非常原始的方式来使用异常的力量。
每个异常对象通常都带有“有效负载”:从发生异常的地方到处理它的地方的信息。作为一个例外,它会释放调用堆栈,沿途的函数可能会拦截它,用额外的信息丰富它并将其发送到更远的地方。程序中的不同功能模块将向异常处理程序发送完全不同的信息,这就是为什么您需要不同的异常类来携带该信息。
例如,解析器异常可能包含有关行号和语法错误性质的信息。文件系统异常可能包含有关文件名和错误代码的信息。动态内存异常可能包含有关特定内存操作和内存块大小的信息。等等。要存储和携带那些完全不相关的数据集,通常会定义不同的异常类型。
答案 1 :(得分:0)
除了在特殊情况下提供不同的数据以及处理不同错误的不同方式之外,您还可以决定在不同的位置处理它们。考虑一个函数loadFileContentIntoMemory
,它可能因文件系统错误(访问权限,文件未找到等)和内存问题(通常为std::bad_alloc
)而引发错误。您可能希望处理一种错误,而另一种错误无法在同一点处理。例如,您可能希望捕获与文件相关的错误并尝试使用其他文件名,而在程序的任何位置通常很难对bad_alloc
执行任何操作,因此许多程序会在非常高级别的位置捕获它错误消息并终止程序。