【问题标题】:GCC comp_except_specs and exception handling/parsingGCC comp_except_specs 和异常处理/解析
【发布时间】:2011-08-25 09:12:38
【问题描述】:

我有点过头了...我已经开始深入研究 GCC G++ 并尝试在函数抛出未在异常规范中定义的异常时抛出警告/错误,反之亦然(你知道,比如 java)。

我觉得我走进了一个全新的星球,里面充满了任意宏,这些宏可以接收各种不同类型的树,然后将它们吐出,我不知道如何与它们交互......

我找到了 comp_except_specs,它比较两种异常类型并返回它们是否相等;但是,仅传递 build_throw 返回的异常和 cp_parser_exception_specification_opt 返回的树会导致内部编译器错误。

如果您遵循了其中的任何一条,那么您对这件事的了解可能比我多。我不是在寻找“答案”,虽然那很好,但任何有关这方面的信息将不胜感激!

编辑: 我的目标是改变编译器(不知道为什么我当时没有提到...)以合并 Java 风格的异常规范错误。我最终确实想出了一个很好的方法来实现它——我想我不记得是怎么做了,现在太早了。

【问题讨论】:

    标签: c++ exception gcc exception-handling


    【解决方案1】:

    我不想让你失望,但据我所知,在 C++ 中不可能进行类似 Java 的异常检查,甚至不能作为 GCC 特定的扩展。

    这是一个疏忽,因为异常在很晚的阶段就被固定在语言上,没有经过深思熟虑。更糟糕的是,以异常规范的形式添加了一些看起来相似但做的事情完全不同并且通常适得其反的东西。

    鉴于惨败及其在例如类似 Java 的检查所需的语法,以及 C++ 社区中异常失败和疲劳的普遍感觉,我们可能永远不会在 C++ 中得到适当的异常检查。

    【讨论】:

      【解决方案2】:

      编辑除了说 g++ 的源代码很复杂之外,我不确定您实际上在问什么。

      下面的旧答案(似乎与实际问题没有太大关系,但我会留下它,以防有一天有人用谷歌搜索它并发现它有用)

      正如另一个答案所说,C++ 没有 Java 风格的检查异常 [1]。事实上,C++ 标准的下一次迭代,C++11(以前的 C++0x)弃用了异常规范,而是添加了一个“noexcept”关键字,可以用来代替旧的“throw()”。参见例如

      http://www.gotw.ca/publications/mill22.htm

      "noexcept" vs "Throws: nothing"

      http://www.boost.org/development/requirements.html#Exception-specification

      [1] 当然,有些人使用 Java 并且不喜欢检查异常,有些框架(Spring IIRC?)将标准异常包装在未检查异常中(继承自 RuntimeException)。

      【讨论】:

        【解决方案3】:

        请在您的问题中更具体,这太宽泛了。

        异常规范在 C++ 中几乎毫无用处。编译器不会检查它。我听说过这样做的静态分析工具。但是我还没有真正遇到过。

        真的很遗憾,与未定义或可疑行为相比,异常是处理错误的更好方法。这只是 C++ 出错的另一件事,而 C++0x 只会加重它。

        我相信 G++ 黑客攻击已经超出了本网站的范围。 GCC/G++ 邮件列表更适合这个。

        【讨论】:

          猜你喜欢
          • 2011-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-11
          • 1970-01-01
          相关资源
          最近更新 更多