2016-07-07 56 views
0

我继承了C++项目,像这样定义一个函数:在抛出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)规范的重点是什么?

+1

您可能感兴趣的[this](http://stackoverflow.com/questions/9418180/function-exceptions-specification-and-standart-exceptions-foo-throwexceptio?rq=1)的问题。 – jaggedSpire

+0

我会说,*“开始*通过在外层例程中添加一个”catch-all'try'语句“来防止核心转储的可能性。###然后,”不要依赖存在能够'重新抛出'你目前掌握在你手中的例外情况。“在发现了一个特殊的例外情况,并且决定因为任何原因你无法处理它时,抛出一个*新的* –

+0

其实,我只是发现http://www.gotw.ca/publications/mill22.htm,这解释了这一点,我没有意识到throw规范是为了防止抛出其他异常类型而明确的。我没有开始明白,但是原始的编码者认为他做了...... ;-) – littlenoodles

回答

4

是的,抛出规范不允许任何异常,除了指定的转义函数外。至于为什么有人会想要这样做,这个想法是文档,显示功能将抛出哪些异常。

然而,实际上,这个概念被证明是无用的,抛出的规范是(或将是,不确定的确切的状态)在新版本的C++中实际删除。所以要采取正确的行动是4号,删除规范。

+1

你确定它被删除?据我所知,它只是不推荐使用,cppreference.com没有提及删除此功能。 – HolyBlackCat

+2

这里有一个建议:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0003r2.html不知道它的最终状态。可能在C++ 17中。 –

+0

如果他们正在采取建议,我会建议,如果在堆栈中找不到捕获异常的捕获器,并且默认行为是核心转储,请在不卸载堆栈的情况下进行核心转储。为什么地球上会有意义的,如果你打算核心转储,放弃转储的所有本地上下文 - 渲染它本质上是无用的。我想这是特定于实现的,但仍然是... – littlenoodles