0

我想知道抛出的对象是否在 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 块中使用?

4

2 回答 2

5

我想知道抛出的对象是否在 c++ 中遵守与其他所有内容相同的范围规则。

抛出的对象本身没有范围,因为范围仅适用于名称并且它没有名称。它有一个稍微特殊的生命周期:它由throw语句在某处构造,然后在处理完异常后销毁。在这种情况下,抛出的对象是err. 此外,由于您按值捕获,因此捕获的对象e是抛出对象的副本,而不是对象本身。

这是否有效,或者在 try 块中创建的事实是否会err阻止它在 catch 块中使用?

它“有效”,因为您可以访问块中的e(的副本errcatch。您无法访问自己,因为当程序离开块err时,它已经超出范围并被破坏;try但副本仍然完好无损,直到您离开该catch块。

于 2013-08-08T23:04:51.963 回答
0

是的,这行得通。

你抛出“err”,catch 块处理“e”;您在“err”中初始化的所有内容都将出现在“e”中。

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

'希望有帮助。

于 2013-08-08T22:54:13.780 回答