所以mongo c ++文档说
在故障转移情况下,预计至少会有一个操作返回 故障转移完成之前出错(抛出异常)。操作 没有重试
有点讨厌,但这让我无法处理失败的操作。理想情况下,我只想让应用程序休眠几秒钟(app是单线程的)。并重新启动,希望建立一个新的主要方法。在第二次失败的情况下,我认为连接真的搞砸了,我只是想抛出异常。
在我的MongodbManager类中,这意味着所有操作都设置了这种双重try / catch块。我想知道是否有更优雅的解决方案?
示例方法:
template <typename T>
std::string
MongoManager::insert(std::string ns, T object)
{
mongo::BSONObj = convertToBson(object);
std::string result;
try {
connection_->insert(ns, oo); //connection_ = shared_ptr<DBClientReplicaSet>
result = connection_->getLastError();
lastOpSucceeded_ = true;
}
catch (mongo::SocketException& ex)
{
lastOpSucceeded_ = false;
boost::this_thread::sleep( boost::posix_time::seconds(5) );
}
// try again?
if (!lastOpSucceeded_) {
try {
connection_->insert(ns, oo);
result = connection_->getLastError();
lastOpSucceeded_ = true;
}
catch (mongo::SocketException& ex)
{
//do some clean up, throw exception
}
}
return result;
}
答案 0 :(得分:0)
这确实是你需要处理它的方式。也许我没有使用两个try / catch块,而是使用以下策略:
然后当所有其他方法都失败时,纾困。