抛出对象范围

时间:2013-08-08 22:49:53

标签: c++ exception exception-handling

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

2 个答案:

答案 0 :(得分:5)

  

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

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

  

这是否有效或是否在try块中创建了err这一事实是否阻止它在catch块中使用?

它“有效”,因为您可以在e块中访问errcatch的副本)。您无法访问err本身,因为当程序离开try块时,它已超出范围并被销毁;但是在您离开catch区块之前,副本仍然完好无损。

答案 1 :(得分:0)

是的,这有效。

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

你可以绝对“抓住”你在“尝试”区块中“抛出”的任何异常。

'希望有所帮助。