【发布时间】:2015-03-11 08:33:03
【问题描述】:
我不确定这是编译器的问题还是我做错了什么。我正在使用 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() 已被调用”。所以我猜系统将其视为未捕获的异常并调用终止()。
另一方面,如果我将 main() 中对象的构造包装在 try-catch 块中,则异常被正确捕获,程序正常终止。
如果我在这里做错了什么,有人可以告诉我吗?
【问题讨论】:
-
查看gotw.ca/gotw/066.htm 了解有关此问题的讨论
-
非常感谢 Jan Herrmann。对于标准来说,如果没有重新抛出异常或者没有从构造函数的函数 try 块中抛出新的异常,那么它将在 catch 块的末尾自动重新抛出,这显然是很有意义的。现在这很有意义。也许正如建议的 pimpl idiom 是我应该开始使用的。再次非常感谢
-
加分“我不允许发布实际代码。所以我已经用这个等效的演示代码重现了这个问题。” 你做了一个非常好的MCVE。
-
很好的问题。
-
如果所有的问题都这样写,水晶球的市场将一落千丈。