当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我应该在哪里捕获构造函数中抛出的C++异常?》经验,为你挑选了1个好方法。

头文件:

#ifndef MUTEXCLASS
#define MUTEXCLASS

#include 

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

#endif // MUTEXCLASS

源文件:

#include "mutexClass.h"
#include 

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

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



1> 6502..:

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

通过明确创建对象的代码(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构造函数抛出异常,将泄漏内存.

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

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有