Суть проблемы:
Пытаюсь подключиться к SQLite БД в конструкторе класса DataWork. Пытаюсь в БД создать таблицу. Если таблица уже создана, то должно отработать исключение.
int main( ) {
DataWork db;
try {
} catch ( DataWork::Error e ) {
std::cout << "catch error: " << e.errorStr << std::endl;
return -1;
}
std::cout << "end of program" << std::endl;
return 0;
}
const std::string CREATE_USERS_TABLE = "Create table users( id integer primary key autoincrement, login varchar(20), serverName varchar(20), password varchar(20) );";
DataWork::DataWork( ) {
if ( sqlite3_open( DBNAME.c_str( ), &m_db ) != SQLITE_OK ) {
char *errorMsg = ( char * ) sqlite3_errmsg( m_db );
throw Error( errorMsg );
}
executeSQL( CREATE_USERS_TABLE );
}
DataWork::~DataWork( ) {
sqlite3_close( m_db );
}
void DataWork::executeSQL( const std::string &sql, int ( *callback )( void *, int, char **, char ** ) ) {
char *errorMsg;
if ( sqlite3_exec( m_db, sql.c_str( ), callback, NULL, &errorMsg ) != SQLITE_OK ) {
throw Error( errorMsg );
}
}
class DataWork {
public:
// структура ошибки
struct Error {
const char *errorStr;
Error( const char *str ) : errorStr( str ) { }
};
DataWork( );
~DataWork( );
private:
void executeSQL( const std::string &sql,
int ( *callback )( void *, int, char **, char ** ) = NULL );
private:
sqlite3 *m_db;
};
Наверное не
DataWork db;
try {
try {
DataWork db;
Rocky, угу, так и выглядит оператор try-catch
Да я в курсе)))) Это сарказм )))
legat, вообще не очень хорошо, если конструктор класса генерирует исключение.
по-моему, использование исключения в конструкторе - нормальная практика. ошибки и утечки тут могут быть только из-за невнимательности программиста.
собственно, конструктор вообще не может вернуть ничего, кроме исключения, в случае ошибки. так что это нормально.
обработка исключений вообще платформозависимая тема (в плане реализации на нативном коде)
Но по сути она куда более сложна чем возврат кодов состояния.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)