我试图创建一个“大多不变”的类,它允许客户端如果需要破坏不变量,但仅当它们在离开范围之前修复它发生这种糟糕的事情。从守卫类析构函数抛出异常导致std :: terminate
以下是涉及的两个类。这与范围守卫相似。更多细节,评论和ideone的小测试。
class HCAccessor;
class HasConditions
{
// class "mostly-invariant"
// 7 < payload_ <42
int payload_;
bool valid() const
{
if (!(7 < payload_) || !(payload_ < 42))
return false;
else
return true;
}
public:
HasConditions(const int payload)
: payload_(payload)
{
if (!valid())
{
throw std::runtime_error("can't construct");
}
}
friend class HCAccessor;
};
class HCAccessor
{
HasConditions& hc_;
public:
HCAccessor(HasConditions& hc)
: hc_(hc)
{}
HCAccessor(HCAccessor& other)
: hc_(other.hc_)
{}
~HCAccessor()
{
if (!hc_.valid())
{
throw std::runtime_error("you broke it!");
}
}
void payload(const int newval)
{
hc_.payload_ = newval;
}
int payload() const
{
return hc_.payload_;
}
};
当“大多是不变的”被打破,然后固定的代码似乎工作。当“大多不变”仍然被打破,~HCAccessor()
抛出,std::terminate
被调用,我不知道为什么。导致std::terminate
呼叫的异常的原因似乎都不合适。
http://en.cppreference.com/w/cpp/error/terminate
至于我可以告诉只有一个异常被抛出,然后立即std::terminate
被调用。
为什么会发生这种情况,我该如何解决?
不要[在析构函数中抛出异常](http://stackoverflow.com/questions/130117/throwing-exceptions-out-of-a-destructor)。 –
除了在析构函数中抛出异常是不好的,你实际上是在试图捕获异常吗?你如何处理'HCAccessor'类的临时对象?还是你在任何地方通过价值传递它? –