【发布时间】:2013-12-03 01:49:41
【问题描述】:
我有以下代码,其中使用函数调用的结果初始化变量。这个函数会抛出,所以我设置了一个 try-catch 来捕获异常。出于某种原因,即使在 catch 子句运行后,异常仍会显示在屏幕上。
#include <iostream>
#include <stdexcept>
int f() { throw std::invalid_argument("threw"); return 50; }
struct S
{
S()
try : r(f())
{
std::cout << "works";
}
catch(const std::invalid_argument&)
{
std::cout << "fails";
}
int r;
};
int main()
{
S s;
}
此代码在显示异常后打印“失败”:
terminate called after throwing an instance of 'std::invalid_argument' what(): threw
为什么仍然抛出异常?我在 main 中设置了相同的代码,它可以正常工作:
int main()
{
try { throw std::invalid_argument("blah"); }
catch(const std::invalid_argument&) { }
}
那么为什么在初始化列表中使用它会失败?
【问题讨论】:
-
这是在某处的标准中定义的...
{S s; cout<<s;}如果s构造失败,你会期待什么? -
我认为你在构造函数初始化列表中抛出的因素可能是相关的。如果列表抛出,您将无法访问 ctr body,因此编译器可能认为 catch 是它尚未启用的主体的一部分。我希望您在 ctr 正文中分配 r ,它的行为会比预期的要好得多。
-
请注意,
catch处理程序正在您的代码中输入;如果您刷新流 @987654330@ 将被打印。当控制到达函数 try 块的末尾时,将重新抛出异常,这就是它们的工作方式。
标签: c++ c++11 exception-handling