确实抛出C++函数声明排除了抛出其他异常

does throw in a C++ function declaration preclude throwing other exceptions?

本文关键字:其他 异常 排除 函数 C++ 声明      更新时间:2023-10-16

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

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

parseDoc函数调用抛出libError的库,调用parseDoc的主函数捕获docErrorlibError并记录它们。 parseDoc本身不会抛出任何异常,但我本以为库中的libError仍然会被main捕获。 他们没有 - 我只是得到一个核心转储,堆栈上没有任何有用的东西。

我尝试了对parseDoc进行各种更改。他们中的一些人libError被传递到链条上。有些没有:

  1. 抓住libError并重新扔掉它 - 不起作用
  2. 抓住libError并将其复制到docError并扔掉它 - 有效
  3. 指定throw(docError, libError)并且不捕获任何内容 - 有效
  4. 从函数定义中删除throw()并且不捕获任何内容 - 有效

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

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

至于为什么有人想要这个,这个想法是文档,准确显示函数将引发哪些异常。

然而,实际上,这个概念被证明是如此无用,以至于抛掷规范实际上在较新版本的C++中删除了(或将要,不确定确切的状态)。因此,要采取的正确操作是第 4 项,即删除规范。