c++ - 抛出 C++ 函数声明会排除抛出其他异常吗?

标签 c++ exception

我继承了一个 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)规范的意义何在?

最佳答案

是的,throw 规范不允许除指定的任何异常以转义函数。

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

然而,实际上,这个概念被证明是无用的,以至于抛出规范在新版本的 C++ 中实际上被删除了(或将不确定确切的状态)。因此,正确的做法是第 4 步,删除规范。

关于c++ - 抛出 C++ 函数声明会排除抛出其他异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38254556/

相关文章:

c++ - 编写多线程异常安全代码

exception - 在本地运行 pig,UDF 程序无法写入文件/文件夹 : PriviledgedActionException

c++ - 错误:静态断言失败:std::thread 参数在转换为右值后必须是可调用的

java.net.URISyntaxException

c++ - 从 Q_INVOKABLE 方法中抛出异常?

java - Java Socket 客户端和 C++(基于 Boost)服务器之间的联网

c# - 如何使用作用域 JsConfig 返回/抛出 ServiceStack 的 HttpError?

c++ - 在不关闭 native 处理程序的情况下销毁 Boost Asio 套接字

c++ - 理解这个 C++ 模块?

c++ - 我的单链表中的一个函数(在找到特定节点后添加一个新节点)使我的程序崩溃