gpt4 book ai didi

c++ - 异常捕获机制,C++

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

考虑这段代码:

int main()
{
try
{
throw std::range_error("");
}
catch (std::bad_alloc)
{
std::cout << "AAAA" << std::endl;
throw;
}
catch (std::range_error)
{
std::cout << "BBB" << std::endl;
throw;
}
catch (std::exception)
{
std::cout << "CCC" << std::endl;
}
std::cout << "DDD" << std::endl;
}

这里我抛出一个类型为std::range_error的异常并 try catch 它。
逻辑上第一个 catch block 无法捕获它,因为类型不匹配(std::bad_allocstd::range_error)。
第二个 catch block 必须捕获它,因为它们是相同类型的 std::range_error
而且,当我在第二个 catch block 中重新抛出异常时,它必须在第三个 catch block 中被捕获。

所以我的输出一定是

BBB
CCC
DDD

但我只得到带有终止符的 BBB 输出。

任何人都可以向我解释一下这种行为吗?

最佳答案

当您重新throw 一个异常时,您将把它完全抛出当前异常处理 block 的上下文....所以,

try 
{
throw std::range_error("");
}
catch (std::bad_alloc)
{
std::cout << "AAAA" << std::endl;
throw;
}
catch (std::range_error)
{
std::cout << "BBB" << std::endl;
throw;
}
catch (std::exception)
{
std::cout << "CCC" << std::endl;
}

一个异常处理 block 。因此,在遇到任何 catch block 中的第一个 throw 时,它会离开整个 block 来寻找另一个处理 block (try-catch ) 在当前范围之外。如果没有找到,程序终止。

请参阅try-catch block in C++

按照您最初的想法打印... Live On Coliru ...

int main()
{
try{
try{
try{
throw std::range_error("");
}
catch (std::bad_alloc) {
std::cout << "AAAA" << std::endl;
throw;
}
}
catch (std::range_error) {
std::cout << "BBB" << std::endl;
throw;
}
}
catch (std::exception){
std::cout << "CCC" << std::endl;
}
std::cout << "DDD" << std::endl;
}

打印:

BBB
CCC
DDD

备案:请避免在生产代码中使用简单的 if-else 阶梯可以完成的控制流异常

关于c++ - 异常捕获机制,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39439452/

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