【问题标题】:stdexcept vs exception Headers in c++c++ 中的 stdexcept 与异常标头
【发布时间】:2014-08-06 14:31:58
【问题描述】:

从 cplusplus.com 对 <exception><stdexcept> 的参考资料来看,<exception> 似乎足以在 C++98 或更高版本的 C++ 中处理异常。

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

【问题讨论】:

  • 通过查看 的标题,我发现包含 ,然后使用哪个。
  • 您查看链接到的页面了吗?正如他们所说,<exception> 定义了基类std::exception,而<stdexcept> 定义了各种标准派生异常类型。 <exception> 对于这些类型不够
  • 没错。如果您需要exception,请使用<exception>(例如,用于定义您自己的派生类型);如果您需要其中定义的类型,请使用<stdexcept>。通常,当您需要该标头的内容时,请包含该标头。
  • 我一直认为这两个标题有特别糟糕、令人困惑和模棱两可的名字。
  • @Cubbi:大概,因为这与异常无关。问题是关于定义异常类型的两个标题。

标签: c++ c++11 exception-handling


【解决方案1】:
  • <stdexcept>:定义了一组标准异常,库和程序都可以使用它们来报告常见错误。

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

    李>

所以,<exception> 只定义了类std::exception,而<stdexcept> 定义了几个继承自std::exception 的类(例如,std::logic_errorstd::out_of_range)。这就是<stdexcept> 包含<exception> 的原因。

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

【讨论】:

  • 该标准根本不要求<stdexcept> 包含<exception>
  • 我不知道不提到标准不需要<stdexcept> 包含<exception> 会如此令人恼火。然而,在大多数实现中,<stdexcept> 包括 <exception>(例如 GCC、VS)。
  • @Puppy C++ 标准确实要求标准异常从std::exception 公开派生。它还要求<exception> 定义std::exception 类。没有定义就不能派生类。您的评论没有多大意义。
  • @MooingDuck 该标准明确表示标准异常派生std::exception,而不是未指定的类。
  • @MaximYegorushkin:C++ 标准在许多 处引用标识符,就好像它们本身就是类一样。请参阅§2.14.7/1 The pointer literal is the keyword nullptr. It is a prvalue of type std::nullptr_t. 但是,std::nullptr_t 明确地是未指定类的 typedef。这阐明了对未指定的类使用 typedef 满足与类直接具有该名称相同的要求。这意味着标准异常可能源自具有标识符 std::exception 的未指定类。
【解决方案2】:

异常是供用户继承和定义自己的异常。

stdexcept 用于捕获和处理标准异常

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 要求std::string 绝对不同于要求<string>
    • @Puppy 在这篇文章中std::string<string> 表示相同的意思——必须包含<string> 标题。但我不明白你的意思。
    • @MaximYegorushkin:在 Visual C++ 中,std::string<string> 中定义,包括<stdexcept><exception> 确实定义了std::string,但 not 是否在 <string> 标头中声明或定义所有其他内容:rextester.com/XYQ2391
    • @MooingDuck 我现在明白你的意思了。这就是我所暗示的:包含stdexcept 也为您提供std::string 定义(无论是包含<string> 还是其他标题)。
    • @MaximYegorushkin:你说你是在暗指它,但你的回答说它特别包括<string>,当Puppy说纠正你时,你说std::string<string>是指一样。我不明白你是如何暗示这一点的,同时明确地说相反。
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多