M>Вроде смог сформулировать в коде, но в один if не понял как затолкать всё:
я бы делал обертки, возвращающие std::pair из самого результата и флага bool или даже std::optional
// тут я не в курсе, что там за типы
std::optional<QUERY_RES_TYPE> execHelperWrapper( DB_MGR *db, const QString& query )
{
bool ok = false;
auto qr = db->execHelper( query, &ok );
return ok ? qr : std::nullopt;
}
std::optional<QString> selectFirstFieldOfFirstRowAsString( DB_MGR *db, const QString& query )
{
auto qr = execHelperWrapper( db, query );
if ( !qr )
return std::nullopt;
auto resVec = db->selectFirstResultToSingleStringVector( qr.value() );
return !resVec.empty() ? resVec.front() : std::nullopt;
}
QDateTime dateTimeFromDbStringWrapper( std::optional<QString> s )
{
QDateTime res;
if ( s )
res = dateTimeFromDbString( s.value() );
return res;
}
и тогда получается
QDateTime dtLastDate = dateTimeFromDbStringWrapper( selectFirstFieldOfFirstRowAsString( pDbMan, selectLastDateQueryText ) );
if (dtLastDate.isNull() || !dtLastDate.isValid())
{
// пытаемся получить dtLastDate ещё как-то
}
if (dtLastDate.isNull() || !dtLastDate.isValid())
{
// Вот тут уже мы поняли точно, что всё пошло не так
continue;
}
// Ду Гуд Жоб Хере