头文件:
#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-a
或 is-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/