函数 try 块是否允许我们解决异常?

2024-02-28

所以我正在阅读有关函数 try 块的内容link https://www.learncpp.com/cpp-tutorial/14-7-function-try-blocks/。还有一行描述了普通 try 块和函数 try 块之间的区别,如下所示

与普通的 catch 块不同,普通的 catch 块允许您解决异常、抛出新异常或重新抛出现有异常,而使用函数级 try 块时,您必须抛出或重新抛出异常

但后来我尝试编写一个像这样的函数 try 块

#include <iostream> 

int add(int a, int b) try {
    throw 1;
    return a + b;
}
catch (int) {
    std::cout << "catch in add()";
}

int main()
{
    try {
        add(1, 2);
    }
    catch (int) {
        std::cout << "catch in main()";
    }
}

输出是

catch in add()

如果函数 try 块不允许我们解决异常,那怎么办?catch in main()没有打印出来


还有一行描述了普通 try 块和函数 try 块之间的区别,如下所示

这条线是不准确的。函数尝试块regular函数的行为几乎就像它们只是函数的唯一内容一样。意思是,你的定义add行为完全相同

int add(int a, int b) {
    try {
        throw 1;
        return a + b;
    }
    catch (int) {
        std::cout << "catch in add()";
    }
}

差异出现在构造函数。首先,函数级 try 块是捕获初始化类成员时引发的异常的唯一方法。

其次,一旦成员初始化抛出异常,构造函数就无法完成,因此对象不会被初始化。正是在这里,我们不能简单地吞掉异常。如果初始化因引发异常而失败,则必须将该异常传播或转换为另一种类型并重新引发。

您链接的页面上的示例总结了代码中的内容

B(int x) try : A(x) // note addition of try keyword here
{
}
catch (...) // note this is at same level of indentation as the function itself
{
            // Exceptions from member initializer list or constructor body are caught here
 
            std::cerr << "Exception caught\n";
 
            // If an exception isn't explicitly thrown here, the current exception will be implicitly rethrown
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数 try 块是否允许我们解决异常? 的相关文章

随机推荐