Написал хелпер для репозиториев. Автоматизирует генерацию sql запросов и парсинг результата.
Работает нормально, код упрощается.
Появилась идея добавить возможность генерации исключений, дабы в большой транзакции не писать самому множество прерываний:
код без исключений:
C++ (Qt)
DatabaseWrapper dbWrapper(db);
dbWrapper.Transaction();
if (dbWrapper.hasError())
{
return MakeResponse(dbWrapper.lastError()); //error response
}
for(int i=0; i<100; ++i)
{
dbWrapper.Insert(/*params*/);
if (dbWrapper.hasError())
{
dbWrapper.Rollback();
return MakeResponse(dbWrapper.lastError()); //error response
}
dbWrapper.Delete(/*params*/);
if (dbWrapper.hasError())
{
dbWrapper.Rollback();
return MakeResponse(dbWrapper.lastError()); //error response
}
dbWrapper.Update(/*params*/);
if (dbWrapper.hasError())
{
dbWrapper.Rollback();
return MakeResponse(dbWrapper.lastError()); //error response
}
dbWrapper.Select(/*params*/);
if (dbWrapper.hasError())
{
dbWrapper.Rollback();
return MakeResponse(dbWrapper.lastError()); //error response
}
}
dbWrapper.Commit();
if (dbWrapper.hasError())
{
dbWrapper.Rollback();
return MakeResponse(dbWrapper.lastError()); //error response
}
return MakeResponse(); // success response
код с исключениями:
C++ (Qt)
DatabaseWrapper dbWrapper(db);
dbWrapper.setSqlErrorExeptionsEnabled(true); // now dbWrapper can throw exeptions
try
{
dbWrapper.Transaction(); //can throw exeption with sqlError
for(int i=0; i<100; ++i)
{
dbWrapper.Insert(/*params*/); //can throw exeption with sqlError
dbWrapper.Delete(/*params*/); //can throw exeption with sqlError
dbWrapper.Update(/*params*/); //can throw exeption with sqlError
dbWrapper.Select(/*params*/); //can throw exeption with sqlError
}
dbWrapper.Commit(); //can throw exeption with sqlError
}
catch(QSqlError error)
{
dbWrapper.setSqlErrorExeptionsEnabled(false); // now dbWrapper can not throw exeptions
dbWrapper.Rollback(); // safely
return MakeResponse(error); //error response
}
return MakeResponse(); // success response
вопрос: какие проблемы могут возникнуть при использовании исключений?
производительность замерял, с исключениями конечно немного медленнее работает, но не соизмеримо со временем отработки самих запросов.