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

水瓶座女孩

头文件:

#ifndef MUTEXCLASS
#define MUTEXCLASS

#include <pthread.h>

class MutexClass
{
private:
    pthread_mutex_t & _mutexVariable;
public:
    MutexClass (pthread_mutex_t &);
    ~MutexClass ();
};

#endif // MUTEXCLASS

源文件:

#include "mutexClass.h"
#include <stdexcept>

MutexClass::MutexClass (pthread_mutex_t & arg) : _mutexVariable (arg)
{
    _mutexVariable  = PTHREAD_MUTEX_INITIALIZER;
    int returnValue = pthread_mutex_lock (&_mutexVariable);
    if (returnValue > 0)
    {
        throw std::logic_error ("Mutex couldn't be locked!");
    }
}

MutexClass::~MutexClass()
{
    pthread_mutex_unlock (&_mutexVariable);
}

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

6502

可以处理构造函数中引发的异常

  • 通过代码显式创建对象(try { MutexClass m; ... } catch(const std::logic_error& e) { ... }
  • 通过代码创建一个包含MutexClass实例成员的对象(包括作为基础子对象...,即通过创建从派生的对象的代码MutexClass
  • 通过代码调用创建异常的代码将展开堆栈,直到某些代码处理它们为止

请注意,对于较大对象(对于关系has-ais-a关系)的成员的对象的构造函数中抛出的异常,有一个棘手的部分。如果成员的构造引发异常,不会调用较大对象的析构函数...在传播异常之前,只有已构造的成员将被销毁。例如一个类似的类:

struct Foo {
    MyData * data;
    MutexClass m;
    MyData() : data(new int[1000]) { }
    ~MyData() { delete[] data; } // NOT called if m constructor throws
};

如果MutexClass构造函数抛出异常,将泄漏内存

同样在编写异常处理程序之前,请问自己是否捕获异常是正确的事情(即,如果您知道在发生这种情况时该怎么做)。捕获异常并“隐藏”它是因为最糟糕的选择,因为在这种情况下您不知道该怎么办。

在特定情况下,如果您无法锁定新创建的互斥锁,您是否可以期望系统仍处于良好状态,以使其保持运行状态是一个好主意?

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该在哪里创建异常对象?

来自分类Dev

应该在哪里抛出异常?

来自分类Dev

我应该在Spring MVC中将异常处理放在哪里?

来自分类Dev

我应该在.Net Web Api 2中返回状态码还是引发异常

来自分类Dev

我应该在装饰器模式中引发异常以处理验证吗?

来自分类Dev

我应该在程序中引发异常还是打印出错误声明?

来自分类Dev

如果您从异步回调中引发/生成异常,那么在哪里/应该/应该捕获该异常?

来自分类Dev

我应该在模型中抛出HttpStatus异常吗?

来自分类Dev

我应该在表示层中抛出异常吗?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

(C#)我应该在计算中注意无穷大/无穷大吗?即引发溢出异常?

来自分类Dev

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

来自分类Dev

JavaScript-我应该在引发异常的“ if”之后写“ else”吗?

来自分类Dev

JavaScript-我应该在引发异常的“ if”之后写“ else”吗?

来自分类Dev

在构造函数中捕获异常

来自分类Dev

我应该在数据库端还是在客户端捕获异常?

来自分类Dev

异常构造函数中的异常

来自分类Dev

我应该在班级中包装班级自定义异常吗?

来自分类Dev

我应该在junit库中声明还是抛出异常?

来自分类Dev

我应该在班级中包装班级自定义异常吗?

来自分类Dev

Delphi在构造函数中引发异常

来自分类Dev

在对象构造函数中引发异常

来自分类Dev

C ++类构造函数引发异常

来自分类Dev

使用move构造函数引发异常?(C ++)

来自分类Dev

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

来自分类Dev

构造函数中的异常

来自分类Dev

如何捕获构造函数异常?

来自分类Dev

无法捕获由std :: thread构造函数引发的异常

Related 相关文章

  1. 1

    我应该在哪里创建异常对象?

  2. 2

    应该在哪里抛出异常?

  3. 3

    我应该在Spring MVC中将异常处理放在哪里?

  4. 4

    我应该在.Net Web Api 2中返回状态码还是引发异常

  5. 5

    我应该在装饰器模式中引发异常以处理验证吗?

  6. 6

    我应该在程序中引发异常还是打印出错误声明?

  7. 7

    如果您从异步回调中引发/生成异常,那么在哪里/应该/应该捕获该异常?

  8. 8

    我应该在模型中抛出HttpStatus异常吗?

  9. 9

    我应该在表示层中抛出异常吗?

  10. 10

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

  11. 11

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

  12. 12

    (C#)我应该在计算中注意无穷大/无穷大吗?即引发溢出异常?

  13. 13

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

  14. 14

    JavaScript-我应该在引发异常的“ if”之后写“ else”吗?

  15. 15

    JavaScript-我应该在引发异常的“ if”之后写“ else”吗?

  16. 16

    在构造函数中捕获异常

  17. 17

    我应该在数据库端还是在客户端捕获异常?

  18. 18

    异常构造函数中的异常

  19. 19

    我应该在班级中包装班级自定义异常吗?

  20. 20

    我应该在junit库中声明还是抛出异常?

  21. 21

    我应该在班级中包装班级自定义异常吗?

  22. 22

    Delphi在构造函数中引发异常

  23. 23

    在对象构造函数中引发异常

  24. 24

    C ++类构造函数引发异常

  25. 25

    使用move构造函数引发异常?(C ++)

  26. 26

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

  27. 27

    构造函数中的异常

  28. 28

    如何捕获构造函数异常?

  29. 29

    无法捕获由std :: thread构造函数引发的异常

热门标签

归档