【发布时间】:2016-07-07 20:19:49
【问题描述】:
我继承了一个 C++ 项目,其函数定义如下:
void myDoc::parseDoc(string& path) throw(docError);
parseDoc 函数调用抛出libError 的库,调用parseDoc 的主函数捕获docError 和libError 并记录它们。 parseDoc 本身不会引发任何异常,但我预计库中的 libErrors 仍会被 main 捕获。他们没有——我只是得到一个核心转储,堆栈上没有任何用处。
我尝试了对parseDoc 的各种更改。他们中的一些人得到libError 传递链。有些则没有:
- 抓住
libError并重新抛出它 - 不起作用 - catch
libError并将其复制到docError并抛出 - 有效 - 指定
throw(docError, libError)并且不捕获任何内容 - 有效 - 从函数定义中删除
throw()并且不捕获任何东西 - 有效
所以我的问题是 - 在此函数定义中添加 throw(docError) 是否会特别防止其他异常通过堆栈传递给调用者?如果是这样,为什么有人愿意这样做?如果不指定一个函数抛出异常只是按照我一直认为的异常应该工作的方式工作,那么throw(e) 规范首先有什么意义?
【问题讨论】:
-
您可能对this问题感兴趣。
-
我会说,“开始”通过将“catch-all
try语句”添加到外部级例程中,以防止发生核心转储的可能性。 ### 然后,“不要依赖于能够‘重新抛出’你目前手头的异常。”捕捉到一个特定的异常,并决定无论出于何种原因你都无法处理它,扔一个新的。 -
其实我刚找到gotw.ca/publications/mill22.htm,就说明了这一点。我没有意识到 throw 规范明确是为了防止抛出其他异常类型。由于可恶的 C++ 理论原因,我开始不明白,但原始编码员认为他做到了...... ;-)
-
做#4。无论如何,Throw 规范实际上已被弃用。