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

在try-catch块之外访问变量

如何解决《在try-catch块之外访问变量》经验,为你挑选了2个好方法。

我有以下代码:

class ClassA
{
public:
    ClassA(std::string str);
    std::string GetSomething();
};

int main()
{
    std::string s = "";
    try
    {
        ClassA a = ClassA(s);
    }
    catch(...)
    {
        //Do something
        exit(1);
    }

    std::string result = a.GetSomething();

    //Some large amount of code using 'a' out there.
}

我想最后一行可以访问a变量.我怎么能实现这一点,因为ClassA没有默认构造函数ClassA(),我不想使用指针?是添加默认构造函数的唯一方法ClassA吗?



1> skyking..:

你不能或不应该.相反,你可以在try块中使用它,例如:

try
{
    ClassA a = ClassA(s);

    std::string result = a.GetSomething();
}
catch(...)
{
    //Do something
    exit(1);
}

原因是因为atry引用该对象之后的块之后超出范围是未定义的行为(如果你有指向它的位置).

如果你关心a.GetSomething或任务,throw你可以放一个try-catch:

try
{
    ClassA a = ClassA(s);

    try {
        std::string result = a.GetSomething();
    }
    catch(...) {
        // handle exceptions not from the constructor
    }
}
catch(...)
{
    //Do something only for exception from the constructor
    exit(1);
}



2> Abyx..:

你可以使用某种optional或只是使用std::unique_ptr.

int main()
{
    std::string s = "";
    std::unique_ptr pa;
    try
    {
        pa.reset(new ClassA(s));
    }
    catch
    {
        //Do something
        exit(1);
    }

    ClassA& a = *pa; // safe because of the exit(1) in catch() block
    std::string result = a.GetSomething();

    //Some large amount of code using 'a' out there.
}

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