异 常 处 理

发布时间:2006-06-28 04:35     点击:
分页:上一页  1 2 3 4 5 6 7 [8] 9 10  下一页

从析构函数中抛出异常是不应该被推荐的,这是因为一个析构函数可能会在另一个异常进行stack unwinding的时候被调用,在这种情况下,异常处理机制就会调用terminate()终止程序。如果你真的想从一个析构函数中抛出异常的话,一种可取的做法是首先检查一下是否还有未被捕获的异常存在。

检查未被捕获的异常

一个异常被捕获是在它相应的handler被找到的情况下。为了检查一个异常是否被捕获,你可以使用标准函数uncaught_exception()(它被定义在标准头文件<stdexcept>)。例如:

class FileException{};

File::~File() throw (FileException)

{

if ( close(file_handle) != success) // failed to close current file?

{

if (uncaught_exception() == true ) // is there any uncaught exception

//being processed currently?

return; // if so, do not throw an exception

throw FileException(); // otherwise, it is safe to throw an exception

// to signal an error

}

return; // success

}

然而,一个更好的选择是直接在析构函数内部处理异常,而不是让他们扩散到外面。例如:

void cleanup() throw (int);

class C

{

public:

~C();

};

C::~C()

{

try

{

cleanup();

}

catch(int)

{

//handle the exception within the destructor

}

}

如果一个异常被函数cleanup()抛出,那么它在析构函数内部就被处理。否则,被抛出的异常就会传播到析构函数的外部,并且如果这个析构函数是在stack unwinding 的过程中被调用,那么程序将会通过terminate()的调用而终止。

全局对象:构造和销毁

我们都知道,全局对象的构造发生在程序开始之前。因此,任何从全局对象的构造函数中抛出的异常将不会被捕获。这一点对于全局对象的析构函数也是一样的-----全局对象的析构函数在程序结束之后被运行。因此,一个从全局对象的析构函数中抛出的异常也不会被捕获。 高级异常处理技术
分页:上一页  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.中国考题网 版权所有