我继承了C++项目,像这样定义一个函数:在抛出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)
规范的重点是什么?
您可能感兴趣的[this](http://stackoverflow.com/questions/9418180/function-exceptions-specification-and-standart-exceptions-foo-throwexceptio?rq=1)的问题。 – jaggedSpire
我会说,*“开始*通过在外层例程中添加一个”catch-all'try'语句“来防止核心转储的可能性。###然后,”不要依赖存在能够'重新抛出'你目前掌握在你手中的例外情况。“在发现了一个特殊的例外情况,并且决定因为任何原因你无法处理它时,抛出一个*新的* –
其实,我只是发现http://www.gotw.ca/publications/mill22.htm,这解释了这一点,我没有意识到throw规范是为了防止抛出其他异常类型而明确的。我没有开始明白,但是原始的编码者认为他做了...... ;-) – littlenoodles