我有一个目前看起来像这样的类(伪伪代码):
class AsyncStore {
public:
AsyncStore();
~AsyncStore() {
// Make sure writes have flushed somehow
}
void write_something() {
// Issue an asynchronous write, and return immediately
}
void sync_writes() {
// Check all writes could be flushed, and throw if any failed
}
};
这就存在一个问题,即析构函数无法发出错误信号(我们无法抛出,我们无法以任何其他方式发出错误信号)。
理想情况下,此类的用户在调用析构函数之前会调用sync_writes()
,并处理抛出的任何异常,因此在销毁时,无需执行任何操作。
目前看来,没有办法强制执行此操作。感觉这必须是一个相对常见的问题 - 是否有办法处理这个问题,以便我可以保证在销毁时没有待处理的写入?
答案 0 :(得分:1)
您可以强制API使用者在销毁对象之前调用sync_writes
。如果使用未完成的工作terminate()
输入析构函数,或执行其他紧急操作(例如,不等待工作并记录错误)。
我认为这是一个API设计问题。只需确定调用者必须正确关闭对象并在运行时强制执行它。如果呼叫者违反了API合同,他们就无法获得正确的结果。
还有另一种方法:强制API使用者注册一个在出现错误时调用的回调。可以在构造函数中接受回调。