当前位置:  开发笔记 > 编程语言 > 正文

构造函数的初始化列表中的异常处理

如何解决《构造函数的初始化列表中的异常处理》经验,为你挑选了2个好方法。

在我的项目中,我找到了一段代码,其中一个方法在构造函数的初始化列表中被调用.

Test2(Test* pTest):m_pTest(pTest), m_nDuplicateID(pTest->getTestID())
    {
    }

我发现Test2的用户可能会将NULL传递给构造函数.由于指针在未经验证的情况下使用,因此存在访问冲突的可能性.

这引发了我在构造函数的初始化列表中查看异常处理.我在其中一篇文章中发现尝试可以在初始化列表中使用.我写了一个小测试程序来测试这个概念:

//Test class stores the unique ID and returns the same with API getTestID
class Test
{
public:

    Test(int nID):m_nID(nID){
    }

    int getTestID() const
    {
            return m_nID;
    }
private:
    int m_nID;

};


class Test2
{
public:

    Test2(Test* pTest) 
        try :m_pTest(pTest), m_nDuplicateID(pTest->getTestID())
    {
    }
    catch (...) 
    {
        cout<<"exception cought "<< endl;
    }

    void printDupID()
    {
        cout<<"Duplicate ID" << m_nDuplicateID << endl;
    }
private:

    Test* m_pTest;
    int m_nDuplicateID;
};

int main(int argc, char* argv[])
{

    Test* pTest = new Test(10);


    Test2 aTest2(pTest);
    aTest2.printDupID();


    delete pTest;

    return 0;
}

此代码未在VC6.0中编译.我是否需要进行任何更改才能在VC 6.0中进行编译?

另外,在文章的其中一篇文章中,我发现在构造函数的初始化列表中使用try并没有严格确认C++标准.在这种情况下,我们如何处理构造函数初始化列表中的异常(标准处理方式)?

谢谢.



1> Mykola Golub..:

C++标准第15/3节

函数try-block将handler-seq与operator-initializer(如果存在)和function-body相关联.在ctor-initializer中执行初始化表达式期间或在函数体执行期间抛出的异常将控制转移到function-try-block中的处理程序,其方式与执行try期间抛出的异常相同-block将控制权转移给其他处理程序.

class C 
{  
    int i;  
    double d;  
public:  
    C(int, double);  
};  

C::C(int ii, double id)  
try  : i(f(ii)), d(id)  
{  
//constructor function body  
}  catch (...)  
{  
//handles exceptions thrown from the ctor-initializer  
//and from the constructor functionbody  
}



2> 小智..:

首先,如果你取消引用NULL指针,标准C++不能保证会抛出异常,所以你的代码对于这种情况是没用的.

其次,如果抛出异常,你的异常处理程序会做什么?

第三,构造函数/函数异常块被广泛认为是时间的流逝 - 看看http://www.gotw.ca/gotw/066.htm以及Herb Sutter的GotW站点上的其他文章.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有