gpt4 book ai didi

c++ - 为什么我的异常被捕获后还是抛出?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:17 26 4
gpt4 key购买 nike

我有以下代码,其中使用函数调用的结果初始化变量。这个函数抛出,所以我设置了一个 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&) { }
}

那么为什么它在初始化列表中使用时会失败?

最佳答案

带有函数 try block 的构造函数(就像您为 S 所拥有的)会自动重新抛出任何被 catch block 捕获的异常。因此,在 catch 捕获异常后,它会重新抛出异常。此行为不同于普通的 catch 处理程序,后者不执行此操作。我认为基本原理是,如果数据成员或基类的构造失败,则对象构造失败。 catch 处理程序的目的只是在异常向外传播之前进行任何额外的清理。

希望这对您有所帮助!

关于c++ - 为什么我的异常被捕获后还是抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com