抛出的对象范围

Thrown objects scope

本文关键字:范围 对象      更新时间:2023-10-16

我想知道抛出的对象是否与其他对象一样遵守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块中的eerr的副本)。你不能访问err本身,因为它已经超出了范围,并且在程序离开try块时被破坏;但在您离开CCD_ 12块之前,副本仍然完好无损。

是的,可以。

你抛出"err",catch块处理"e";在"err"中初始化的所有内容都将显示在"e"中。

您绝对可以"捕获"您在"尝试"块中"抛出"的任何异常。

希望能有所帮助。