我想知道抛出的对象是否遵循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块中使用?
答案 0 :(得分:5)
我想知道抛出的对象是否遵循c ++中与其他所有相同的范围规则。
抛出的对象本身没有范围,因为范围仅适用于名称而且没有名称。它有一个稍微特殊的生命周期:它由throw
语句构造在某处,然后在处理完异常后销毁。在这种情况下,抛出的对象是err
的副本。此外,由于您按值捕获,捕获的对象e
是抛出对象的副本,而不是对象本身。
这是否有效或是否在try块中创建了
err
这一事实是否阻止它在catch块中使用?
它“有效”,因为您可以在e
块中访问err
(catch
的副本)。您无法访问err
本身,因为当程序离开try
块时,它已超出范围并被销毁;但是在您离开catch
区块之前,副本仍然完好无损。
答案 1 :(得分:0)
是的,这有效。
你抛出“错误”,catch块处理“e”;你在“错误”中初始化的所有内容都将出现在“e”中。
你可以绝对“抓住”你在“尝试”区块中“抛出”的任何异常。
'希望有所帮助。