分页:
上一页 1 2 3 [4] 5 6 7 8 9 10 下一页
}
catch(int n)
{
}
throw表达式和返回语句很相似。empty throw是没有操作数的throw语句。例如:
throw;
在handler中的empty throw表明它在重新抛出异常,后面我们会讨论到它。另外,如果目前没有异常被处理,那么执行一个empty throw将会调用terminate()。
Stack Unwinding
当一个异常被抛出,运行时机制首先在当前的作用域寻找合适的handler。如果不存在这样一个handler,那么将会离开当前的作用域,进入更外围的一层继续寻找。这个过程不断的进行下去直到合适的handler被找到为止。此时堆栈已经被解开,并且所有的局部对象被销毁。如果始终都没有找到合适的handler,那么程序将会终止。注意,C++保证局部对象被适当的销毁仅仅是在抛出的异常被处理的情况下。一个未被扑获得异常是否引起局部对象的销毁由实现决定的。为了保证局部对象的析构函数在异常未被捕获情况下也能够被正常调用,你应该在main()里加入捕获任何异常的catch语句。例如:
int main()
{
try
{
//...
}
catch(std::exception& stdexc) // handle expected exceptions
{
//...
}
catch(...) // ensure proper cleanup in the case of an uncaught exception
{
}
return 0;
}
stack unwinding的过程就好比一个返回语句序列,每一个都返回相同的对象给它的调用者。
传递异常对象给handler
一个异常能够按值或者按引用的方式传递给它的handler。为异常对象分配的内存是通过一种未被定义的途径(但是并没有在自由存储区)。一些实现使用专门的异常堆栈,在那里,异常对象被创建。当一个异常按引用的方式传递,handler获得是在异常堆栈上建立的对象的引用。通过引用方式传递异常保证了它的多态行为。按值传递的异常被建立在调用者的堆栈上。例如:
#include <cstdio>
class ExBase {/*...*/};
class FileEx: public ExBase {/*...*/};
void Write(FILE *pf)
{
if (pf == NULL) throw FileEx();
//... process pf normally
分页:
上一页 1 2 3 [4] 5 6 7 8 9 10 下一页