在 C++ 函数声明中 throw 是否排除了引发其他异常?

lit*_*les 0 c++ exception

我继承了一个 C++ 项目,其函数定义如下:

void myDoc::parseDoc(string& path) throw(docError);

parseDoc函数调用抛出一个库libError,主要功能是通话parseDoc渔获量都docErrorlibError和记录它们。 parseDoc本身不会抛出任何异常,但我预计libError库中的s 仍会被main. 他们没有 - 我只是得到一个核心转储,堆栈上没有任何用处。

我尝试了对parseDoc. 其中一些被libError传递到链条上。有些没有:

  1. 捕获libError并重新抛出它 - 不起作用
  2. 捕获libError并将其复制到 adocError并抛出 - 有效
  3. 指定但throw(docError, libError)不捕获任何东西 - 有效
  4. throw()从函数定义中删除并且不捕获任何东西 - 有效

所以我的问题是 -throw(docError)向这个函数定义添加 a是否专门防止其他异常从堆栈向上传递给调用者?如果是这样,为什么有人想要这样做?如果没有指定函数抛出异常只是按照我一直认为异常应该工作的方式工作,那么throw(e)首先规范的重点是什么?

Seb*_*edl 5

是的,抛出规范不允许除指定之外的任何异常转义函数。

至于为什么有人会想要那个,这个想法是文档,显示函数将抛出哪些异常。

然而,实际上,事实证明这个概念是如此无用,以至于在较新版本的 C++ 中实际上删除了 throw 规范(或将要不确定确切状态)。所以要采取的正确行动是数字 4,删除规范。

  • 这里有一个提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0003r2.html 不确定它的最终状态。可能在 C++17 中。 (2认同)