异 常 处 理

发布时间:2006-06-28 04:35     点击:
分页:上一页  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  下一页
版权申明:未经书面授权请勿转载本站信息!!作品版权归所属媒体与作者所有!!
发表评论: 匿名发表 用户名: 查看评论
您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任
留言板管理人员有权保留或删除其管辖留言中的任意内容
本站提醒:不要进行人身攻击。谢谢配合。
在本站搜索相关信息
2003-2005 Ksw123.com All Rights Reserved. - TOP
Copyright © 2006 Ksw123.com. All rights reserved.中国考题网 版权所有