c++ - 我应该在哪里捕获构造函数中抛出的 C++ 异常?

标签 c++ exception

头文件:

#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);
}

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

最佳答案

可以处理构造函数中抛出的异常

  • 通过代码显式创建对象 (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 构造函数抛出异常,将会泄漏内存。

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

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

关于c++ - 我应该在哪里捕获构造函数中抛出的 C++ 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461395/

相关文章:

python - 如果抛出异常,为什么 try 在第一个语句后退出?

c++ - try block 对于 "zero-cost"堆栈展开策略是否必要甚至有帮助?

尝试添加类构造时的 C++ 无作用域枚举类型

c++ - 我怎样才能安全地(轻松地)计算程序中某个类的*所有*实例?

c++ - 在 C++ 中为 const char * 变量释放内存

c++使用指针的自定义矩阵模板

java - 为什么我不能在 Java 8 lambda 表达式中抛出异常?

java - 类名可以用作数组的数据类型吗?

exception - Elasticsearch中的TermSuggestionBuilder Java API不返回任何结果

c++ - 如何有效地比较 C++ 中的两个 vector ,其内容不能进行有意义的排序?