抛出的对象范围
Thrown objects scope
我想知道抛出的对象是否与其他对象一样遵守c++中的作用域规则。下面是一个例子。
try{
Error err;
err.num = 10;
err.str = "This will be thrown."
throw err;
}
catch(Error e){
cout << "Error num is: " << e.num << " error string is: " << e.str << endl;
}
这行得通吗?还是err
是在try
块中创建的,这一事实阻止了它在catch块中使用?
我想知道抛出的对象是否和其他对象一样遵守c++中的作用域规则。
抛出的对象本身没有作用域,因为作用域只适用于名称,它没有名称。它有一个稍微特殊的生存期:它由throw
语句在某个地方构造,然后在处理完异常后销毁。在这种情况下,抛出的对象是err
的副本。此外,由于您是按值捕获的,因此捕获的对象e
是抛出对象的副本,而不是对象本身。
这行得通吗?还是
err
是在try块中创建的,这一事实阻止了它在catch块中使用?
它的"作用"在于,您可以访问catch
块中的e
(err
的副本)。你不能访问err
本身,因为它已经超出了范围,并且在程序离开try
块时被破坏;但在您离开CCD_ 12块之前,副本仍然完好无损。
是的,可以。
你抛出"err",catch块处理"e";在"err"中初始化的所有内容都将显示在"e"中。
您绝对可以"捕获"您在"尝试"块中"抛出"的任何异常。
希望能有所帮助。
相关文章:
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 如何访问超出其块范围的对象?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 对象超出范围/转让所有权
- 从函数返回范围视图时,带有std::span:中间对象所有权的C++Ranges-v3
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- 是否可以在C++ (C) 中使用全局范围对象(结构)?
- 基于范围的 for 循环将对象移动到另一个容器中?
- 对象超出范围后,引用成员设置为 0
- 哪个函数负责C++全局范围内的类对象初始化?
- 非常量对象的向量似乎在基于范围的 for 循环中被视为常量
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 是否有一种方法可以根据派生的可能性值范围限制对象参数
- 类对象未在范围中声明
- 如何打印出唯一指针对象向量中的值(基于范围的循环)?C++
- 基于范围的 for 循环,用于包含C++中的指针的自定义链表,仅返回对象
- 带有GCC的C++11中的线程范围对象
- C++ / GCC - 未调用文件范围对象的构造函数