构造函数作为函数 try 块 - 异常中止程序
Constructor as a function try block - Exception aborts program
我不确定这是编译器的问题还是我做错了什么。我正在使用 Visual Studio 2013 编译器。
我有一个 class,我需要在我的构造函数初始化列表中获取大量资源,其中大部分都可能引发异常。我将成员初始值设定项列表包装在一个函数 try 块中,并在那里捕获了异常。但是我的程序仍然中止,即使 catch 子句没有重新抛出异常。我不允许 post 实际代码。所以我用这个等效的演示代码重现了这个问题。有人可以帮我解决这个问题吗?
#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() has been called"。所以我猜系统将此视为未捕获的异常并调用 terminate()。
另一方面,如果我将 main() 中的对象构造包装在一个 try-catch 块中,则异常会被正确捕获并且程序正常终止。
如果我做错了什么,有人可以告诉我吗?
有一个相关的gotw
基本上即使你不抛出你的catch块,异常也会自动重新抛出
If the handler body contained the statement "throw;" then the catch
block would obviously rethrow whatever exception A::A() or B::B() had
emitted. What's less obvious, but clearly stated in the standard, is
that if the catch block does not throw (either rethrow the original
exception, or throw something new), and control reaches the end of the
catch block of a constructor or destructor, then the original
exception is automatically rethrown.
根据 the cppreference.com documentation for function-try
blocks,这是正常行为:构造函数或析构函数上的所谓 function-try-block 必须从其 catch 子句中抛出,否则在 catch 子句之后有一个隐式的重新抛出。
这很有道理:对象 A
尚未正确构造,因此不适合使用:它必须抛出异常。您必须确保在构造对象的地方构造是否成功,即您在 main()
.
中的示例
构造函数中无法捕获异常 function-try-block
。
n3376 15.2/15
The currently handled exception is rethrown if control reaches the end
of a handler of the function-try-block of a constructor or destructor.
你应该在创建对象的地方抓到它。
我建议您阅读文章:"GotW #66 Constructor Failures"在网站上:http://gotw.ca/gotw/066.htm
我不确定这是编译器的问题还是我做错了什么。我正在使用 Visual Studio 2013 编译器。
我有一个 class,我需要在我的构造函数初始化列表中获取大量资源,其中大部分都可能引发异常。我将成员初始值设定项列表包装在一个函数 try 块中,并在那里捕获了异常。但是我的程序仍然中止,即使 catch 子句没有重新抛出异常。我不允许 post 实际代码。所以我用这个等效的演示代码重现了这个问题。有人可以帮我解决这个问题吗?
#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() has been called"。所以我猜系统将此视为未捕获的异常并调用 terminate()。
另一方面,如果我将 main() 中的对象构造包装在一个 try-catch 块中,则异常会被正确捕获并且程序正常终止。
如果我做错了什么,有人可以告诉我吗?
有一个相关的gotw
基本上即使你不抛出你的catch块,异常也会自动重新抛出
If the handler body contained the statement "throw;" then the catch block would obviously rethrow whatever exception A::A() or B::B() had emitted. What's less obvious, but clearly stated in the standard, is that if the catch block does not throw (either rethrow the original exception, or throw something new), and control reaches the end of the catch block of a constructor or destructor, then the original exception is automatically rethrown.
根据 the cppreference.com documentation for function-try
blocks,这是正常行为:构造函数或析构函数上的所谓 function-try-block 必须从其 catch 子句中抛出,否则在 catch 子句之后有一个隐式的重新抛出。
这很有道理:对象 A
尚未正确构造,因此不适合使用:它必须抛出异常。您必须确保在构造对象的地方构造是否成功,即您在 main()
.
构造函数中无法捕获异常 function-try-block
。
n3376 15.2/15
The currently handled exception is rethrown if control reaches the end of a handler of the function-try-block of a constructor or destructor.
你应该在创建对象的地方抓到它。
我建议您阅读文章:"GotW #66 Constructor Failures"在网站上:http://gotw.ca/gotw/066.htm