因此,我们正在研究使用范围保护或一些类似机制来确保传入/传出对象的有效性和/或内部状态不变性,类似于 C# 代码合同。
在正常处理过程中出现意外情况/异常导致某些对象处于不一致状态的特定情况下,我们可以/应该使用什么机制来回避范围保护将抱怨的事实当我们跳出函数?
这是一些示例伪代码来说明我的观点:
struct IObjectValidator;
struct ObjectValidatorScopeGuard
{
ObjectValidatorScopeGuard(IObjectValidator * pObj)
: m_ptr(pObj)
{
Assert(!m_ptr || m_ptr->isValid());
}
~ObjectValidatorScopeGuard()
{
Assert(!m_ptr || m_ptr->isValid());
}
private:
IObjectValidtor * m_ptr;
};
int SomeComponent::CriticalMethod(const ThingA& in, ThingB& inout, ThingC * out)
{
ObjectValidatorScopeGuard sg1(static_cast<IObjectValidator *>(&in));
ObjectValidatorScopeGuard sg2(static_cast<IObjectValidator *>(&inout));
ObjectValidatorScopeGuard sg3(static_cast<IObjectValidator *>(out));
// create out
try
{
out = new ThingC();
out->mergeFrom(inout, out); // (1)
}
catch (const EverythingHasGoneHorriblyWrongException& ex)
{
// (2) out and inout not guaranteed valid here..
}
return 0;
}
因此,如果 (1) 中出现问题导致“out”或“inout”在点 (2) 处于错误状态,则范围保护 sg2/sg3 将抛出异常......并且这些异常可能会掩盖真正的原因。
是否有任何模式/约定可以处理这种情况?我们是否遗漏了一些明显的东西?