我不确定这是编译器的问题还是我做错了.我正在使用Visual Studio 2013编译器.
我有一个类,我需要在构造函数初始化列表中获取大量资源,其中大部分都可以抛出异常.我在函数try块中包装了成员初始化列表,并在那里捕获了异常.但是我的程序仍然会中止,即使catch子句没有重新抛出异常.我不允许发布实际代码.所以我用这个等效的演示代码重现了这个问题.有人可以帮我解决这个问题吗?
#include <iostream>
using namespace std;
class A{
public:
A() try : i{ 0 }{ throw 5; }
catch (...){ cout << "Exception" << endl; }
private:
int i;
};
int main(){
A obj;
}
Run Code Online (Sandbox Code Playgroud)
在执行此代码时,我得到一个Windows警报"abort()已被调用".所以我猜系统将此视为未捕获的异常并调用terminate().
另一方面,如果我在try(catch)块中的main()中包装对象的构造,则正确捕获异常并且程序正常终止.
有人可以告诉我,如果我在这里做错了吗?
dau*_*ama 30
有一个相关的新闻
基本上即使你没有抛出你的catch块,异常也会自动被重新抛出
如果处理程序主体包含语句"throw;" 那么catch块显然会重新抛出A :: A()或B :: B()发出的异常.不太明显但在标准中明确指出的是,如果catch块没有抛出(重新抛出原始异常,或抛出新的东西),并且控制到达构造函数或析构函数的catch块的末尾,那么原始异常会自动重新抛出.
Wal*_*ter 22
根据功能try块的cppreference.com文档,这是正常行为:构造函数或析构函数上的所谓函数 - try-block必须从其catch子句抛出,否则在catch子句之后会有隐式重新抛出.
这很有道理:对象A没有正确构造,因此不适合使用:它必须抛出异常.您必须确保构造对象的构造是否成功,即在您的示例中main().
在构造函数中无法捕获异常function-try-block.
n3376 15.2/15
如果控制到达构造函数或析构函数的function-try-block的处理程序的末尾,则重新抛出当前处理的异常.
你应该在对象创建的地方捕获它.