如何从C ++中的构造函数中捕获异常

空值

假设我们有一个可能抛出异常的构造函数。

class A{
public:
    A(); // may throw exceptions
};

我们可以使用这种方式来捕获异常:

try{
    A a;
    // do somethings to a, and I have to put everything about a here
}catch(...){
    // handle exceptions
}

所以我的问题是如何避免在try-catch不使用指针的情况下将所有内容放入块中。

Smeeheey

您可以定义一个创建函数来为您处理异常,并在出现异常时返回明智的默认值,例如:

struct A
{    
    A() : data("Default")
    {
        std::cout << "In A()" << std::endl;
    }

    A(const A& other) : data(other.data)
    {
        std::cout << "In A(A)" << std::endl;
    }

    A(bool param) 
    {
        std::cout << "In A(bool)" << std::endl;
        if(param)
            throw std::runtime_error("Failed");

        data = "Hello";
    }

    std::string data;
};

A createA(bool param, A& def_a)
try
{
    return A(param);
}
catch (...) {
    //...
    return def_a;
}

然后,您可以A使用该函数的返回值初始化实际值。由于RVO,如果创建成功,则仅在失败时将不执行任何复制(因为必须先复制默认值):

int main(int argc, char**args) 
{
    A defA;

    A a1 = createA(true, defA);
    A a2 = createA(false, defA);

    std::cout << "A1: " << a1.data << std::endl;
    std::cout << "A2: " << a2.data << std::endl;

    return 0;
}

输出为:

In A()
In A(bool)
In A(A)
In A(bool)
A1: Default
A2: Hello

第一个构造函数是默认值。然后,您可以看到在第一个A(bool)调用(引发)之后,进行了复制构造函数调用以返回默认值。第二个调用不会失败,没有复制构造函数调用(由于RVO)。在此之后,您将获得一个默认值A和一个成功创建的默认值A以后可以使用它。

当然,如果复制构造函数也可以抛出该异常,则可能会有异常转义createA-如果是这种情况,则您必须进行一些修改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++在构造函数中捕获异常

来自分类Dev

如何从构造函数中捕获异常而不处理整个函数?

来自分类Dev

如何在构造函数中捕获异步方法的异常?

来自分类Dev

如何捕获构造函数异常?

来自分类Dev

我应该在哪里捕获构造函数中引发的C ++异常?

来自分类Dev

PostgreSQL:如何在函数中捕获异常?

来自分类Dev

无法从c ++中的函数捕获异常

来自分类Dev

无法从c ++中的函数捕获异常

来自分类Dev

在构造函数C ++中引发异常

来自分类Dev

在构造函数C ++中引发异常

来自分类Dev

构造函数中的异常 - C++

来自分类Dev

如何捕获已被 Python 中的嵌套函数调用捕获的异常

来自分类Dev

在构造函数中捕获异常

来自分类Dev

如何从Node.js中的构造函数发出/捕获事件?

来自分类常见问题

如何在yield调用函数中防止或捕获StopIteration异常?

来自分类Dev

如何从扭曲的inlineCallbacks装饰函数中捕获异常?

来自分类Dev

如何从成员析构函数中捕获异常

来自分类Dev

如何捕获在C函数调用的Haskell回调函数中引发的Haskell异常?

来自分类Dev

C#的自定义异常处理中的base()构造函数。它是如何工作的?

来自分类Dev

如何使用基于 C# 中自定义异常构造的函数抛出自定义异常?

来自分类Dev

从构造函数中调用构造函数并捕获异常

来自分类Dev

如何在C ++中“默认构造函数”

来自分类Dev

c ++中的副本构造函数如何工作?

来自分类Dev

C ++,静态对象构造函数中的异常会绕过先前静态对象的析构函数

来自分类Dev

如何停止捕获C#中的特定异常

来自分类Dev

如何捕获在JsonConverter属性中引发的异常?

来自分类Dev

如何在PowerShell中捕获异常?

来自分类Dev

如何在向量中捕获.erase异常?

来自分类Dev

如何在python中捕获异常消息?

Related 相关文章

  1. 1

    C ++在构造函数中捕获异常

  2. 2

    如何从构造函数中捕获异常而不处理整个函数?

  3. 3

    如何在构造函数中捕获异步方法的异常?

  4. 4

    如何捕获构造函数异常?

  5. 5

    我应该在哪里捕获构造函数中引发的C ++异常?

  6. 6

    PostgreSQL:如何在函数中捕获异常?

  7. 7

    无法从c ++中的函数捕获异常

  8. 8

    无法从c ++中的函数捕获异常

  9. 9

    在构造函数C ++中引发异常

  10. 10

    在构造函数C ++中引发异常

  11. 11

    构造函数中的异常 - C++

  12. 12

    如何捕获已被 Python 中的嵌套函数调用捕获的异常

  13. 13

    在构造函数中捕获异常

  14. 14

    如何从Node.js中的构造函数发出/捕获事件?

  15. 15

    如何在yield调用函数中防止或捕获StopIteration异常?

  16. 16

    如何从扭曲的inlineCallbacks装饰函数中捕获异常?

  17. 17

    如何从成员析构函数中捕获异常

  18. 18

    如何捕获在C函数调用的Haskell回调函数中引发的Haskell异常?

  19. 19

    C#的自定义异常处理中的base()构造函数。它是如何工作的?

  20. 20

    如何使用基于 C# 中自定义异常构造的函数抛出自定义异常?

  21. 21

    从构造函数中调用构造函数并捕获异常

  22. 22

    如何在C ++中“默认构造函数”

  23. 23

    c ++中的副本构造函数如何工作?

  24. 24

    C ++,静态对象构造函数中的异常会绕过先前静态对象的析构函数

  25. 25

    如何停止捕获C#中的特定异常

  26. 26

    如何捕获在JsonConverter属性中引发的异常?

  27. 27

    如何在PowerShell中捕获异常?

  28. 28

    如何在向量中捕获.erase异常?

  29. 29

    如何在python中捕获异常消息?

热门标签

归档