头文件:
#ifndef MUTEXCLASS #define MUTEXCLASS #includeclass MutexClass { private: pthread_mutex_t & _mutexVariable; public: MutexClass (pthread_mutex_t &); ~MutexClass (); }; #endif // MUTEXCLASS
源文件:
#include "mutexClass.h" #includeMutexClass::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-a
或一个is-a
关系)的成员的对象的构造函数抛出的异常,有一个棘手的部分.如果成员的构造引发异常,则不会调用较大对象的析构函数...只有已构造的成员才会在传播异常之前被销毁.例如,类如下:
struct Foo { MyData * data; MutexClass m; MyData() : data(new int[1000]) { } ~MyData() { delete[] data; } // NOT called if m constructor throws };
如果MutexClass
构造函数抛出异常,将泄漏内存.
在编写异常处理程序之前,请问自己,捕获异常是否正确(即如果您知道在发生该情况时该怎么做).捕获异常并"隐藏"它,因为在这种情况下您不知道该怎么做是最糟糕的选择.
在特定情况下,如果您无法锁定新创建的互斥锁,您是否可以期望系统仍然保持良好的状态以保持其运行是一个好主意?