我继承了一个 C++ 项目,其函数定义如下:
void myDoc::parseDoc(string& path) throw(docError);
parseDoc
函数调用了一个抛出 libError
的库,调用 parseDoc
的主函数捕获了两个 docError
和 libError
并记录它们。 parseDoc
本身不会抛出任何异常,但我希望库中的 libError
仍会被 main
捕获。他们没有 - 我只是得到一个核心转储,堆栈上没有任何有用的东西。
我尝试对 parseDoc
进行各种更改。其中一些得到 libError
向上传递。而有些则没有:
- 捕获
libError
并重新抛出它 - 不起作用 - 捕获
libError
并将其复制到docError
并抛出 - 有效 - 指定
throw(docError, libError)
并且不捕获任何东西 - 有效 - 从函数定义中删除
throw()
并且不捕获任何东西 - 有效
所以我的问题是 - 向这个函数定义添加一个 throw(docError)
是否专门防止其他异常被向上传递给调用者?如果是这样,为什么会有人想要这样做?如果不指定一个函数抛出异常就像我一直认为异常应该工作的方式一样工作,那么首先throw(e)
规范的意义何在?
最佳答案
是的,throw 规范不允许除指定的任何异常以转义函数。
至于为什么有人会想要那个,这个想法是文档,准确显示函数将抛出哪些异常。
然而,实际上,这个概念被证明是无用的,以至于抛出规范在新版本的 C++ 中实际上被删除了(或将不确定确切的状态)。因此,正确的做法是第 4 步,删除规范。
关于c++ - 抛出 C++ 函数声明会排除抛出其他异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38254556/