在<exception>
的cplusplus.com参考和<stdexcept>
的参考中,似乎<exception>
足以在C ++ 98或更高版本的C ++中进行异常处理。
为什么C ++有两个头文件用于异常处理?这对我的发展有何影响?我应该使用哪个标题?
答案 0 :(得分:39)
<stdexcept>
:定义一组标准异常,库和程序都可以使用它们来报告常见错误。
<exception>
:定义标准库元素抛出的所有异常的基类(即std::exception
),以及帮助处理异常的几种类型和实用程序。
因此,<exception>
只定义了类std::exception
,而<stdexcept>
定义了从std::exception
继承的几个类(例如std::logic_error
,{{1} })。这就是为什么std::out_of_range
包含<stdexcept>
。
它们位于单独的标头中,因为如果要定义自己的继承<exception>
的异常类(而不是使用std::exception
中的类),则可以避免不必要的定义。
答案 1 :(得分:12)
一个实际的考虑因素是<stdexcept>
需要std::string
定义(异常构造函数接受std::string
并拥有std::string
数据成员),而要捕获和查询std::exception
std::string
声明或定义不是必需的。
换句话说,std::exception
处理程序只需要<exception>
。 throw网站需要它抛出的特定异常类的标题。
答案 2 :(得分:0)
exception 供用户继承并定义自己的异常。
stdexcept 用于捕获和处理标准异常