stdexcept与c ++中的异常标题

Kri*_*Oza 29 c++ exception-handling c++11

从cplusplus.com参考文献中可以看出,对于C++ 98或更高版本的C++中的异常处理<exception>来说<stdexcept>,这似乎<exception>已经足够了.

为什么C++有两个头文件用于异常处理?这对我的发展有何影响?我应该使用哪个标头?

101*_*010 44

  • <stdexcept>:定义一组标准异常,库和程序都可以使用它们来报告常见错误.

  • <exception>:std::exception为标准库的元素抛出的所有异常定义基类(即),以及帮助处理异常的几种类型和实用程序.

因此,<exception>只定义了类std::exception,同时<stdexcept>定义了几个继承自的类std::exception(例如std::logic_error,std::out_of_range).这就是为什么<stdexcept>包括<exception>.

它们位于单独的头文件中,因为如果要定义自己的异常类继承std::exception(而不是使用类<stdexcept>),则可以避免不必要的定义.

  • @Surfing_SO你还期待什么? (13认同)
  • 该标准根本不要求`&lt;stdexcept&gt;` 包含`&lt;exception&gt;`。 (2认同)

Max*_*kin 12

一个实际考虑因素是<stdexcept>需要std::string定义(异常构造函数接受std::string并具有std::string数据成员),而不需要捕获和查询std::exception std::string声明或定义.

换句话说,std::exception处理程序只需要<exception>.throw网站需要它抛出的特定异常类的标头.

  • 要求`std :: string`绝对不同于要求`<string>`. (2认同)
  • @MaximYegorushkin:在Visual C++中,`std :: string`类在`<string>`中_not_定义,包括`<stdexcept>`和`<exception>`确定`std :: string`,但是_not_声明或定义`<string>`标题中的所有其他内容:http://rextester.com/XYQ2391 (2认同)