C++中异常对象的作用域是什么?它是否在catch处理程序执行后立即超出作用域?此外,如果我创建一个未命名的异常对象并将其抛出,那么在捕获该异常时,通过const引用还是非const引用捕获有关系吗?
C++中异常对象的作用域是什么?它是否在catch处理程序执行后立即超出作用域?此外,如果我创建一个未命名的异常对象并将其抛出,那么在捕获该异常时,通过const引用还是非const引用捕获有关系吗?
异常对象仅在catch
块中可用。您不能在catch
块外使用异常对象。当您抛出异常并捕获时,会发生以下步骤:
try
{
MyException anObject;
throw anObject; //1
}
catch(MyException exObject)
{
}
throw
子句(//1)接收局部对象anObject
,并将其视为值参数:它创建了anObject
的一个副本。catch
处理程序捕获MyException
对象,这也是一个值参数。此时会创建另一个副本。catch
处理程序实现为接收一个对象引用(catch (MyException &o))
,则避免第二个副本的创建。catch
处理程序通过const&
接收异常对象,则只能调用const
方法。throw
语句之外创建对象是一个非常糟糕的想法,因为这可能会导致冗余副本。相反,应该使用throw Myexception();
。除此之外,如果你声明了一个带有名称的异常对象(就像在这个答案中一样),那么当然可以在声明它的作用域之外的catch
块中访问它,在这种情况下,是在try
块内部。 - Konrad Rudolph首先,您抛出的对象几乎立即超出范围。异常处理程序将捕获原始对象的一个副本。除非您通过值(而不是引用)捕获它,在执行catch处理程序后,该副本将被删除。在这种情况下,将创建另一个副本。但无论如何,您都应该捕获它的引用(最好是const引用)。