我不确定这是否与编译器有关,或者我做错了什么。我正在使用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;
}

执行此代码后,我得到一个Windows警报“abort()已被调用”。因此,我想系统会将其视为未捕获的异常并调用Terminate()。

另一方面,如果我将对象的构造包装在try(catch)块中的main()中,则可以正确捕获异常,并且程序可以正常终止。

有人可以告诉我在这里做错什么吗?

最佳答案

有一个相关的东西

http://gotw.ca/gotw/066.htm

基本上,即使您没有抛出catch块,该异常也会自动重新抛出

关于c++ - 构造函数作为功能try块-异常终止程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27921250/

10-11 22:08
查看更多