crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Обработка собственных исключений
legat
  опции профиля:
сообщение 17.5.2011, 12:59
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 8.8.2010
Пользователь №: 1940

Спасибо сказали: 0 раз(а)




Репутация:   0  


Суть проблемы:
Пытаюсь подключиться к 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;
};


В теле функции ExecuteSQL выводится сообщение об ошибке (простая проверка, что сообщение вообще что-то содержит):
error happend!: table users already exists.
Так и должно быть.
Затем должно отработать моё исключение, но вместо этого выводится terminate called after throwing an instance of 'DataWork::Error' Аварийный останов. Программирую на клоне Debian.
Как сделать так, чтобы обработалось моё исключение и программа продолжила свою работу, т.е. вывела тестовое сообщение 'end of program'.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 17.5.2011, 14:34
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Наверное не
    DataWork db;
    try {

а
  try {
DataWork db;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.5.2011, 7:04
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Rocky, угу, так и выглядит оператор try-catch
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 19.5.2011, 9:57
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Да я в курсе)))) Это сарказм )))

legat, вообще не очень хорошо, если конструктор класса генерирует исключение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.5.2011, 14:01
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Rocky @ 19.5.2011, 12:57) *
legat, вообще не очень хорошо, если конструктор класса генерирует исключение.
если исключения и использовать, то лучше в конструкторе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 20.5.2011, 20:50
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(Litkevich Yuriy @ 19.5.2011, 15:01) *
Цитата(Rocky @ 19.5.2011, 12:57) *
legat, вообще не очень хорошо, если конструктор класса генерирует исключение.
если исключения и использовать, то лучше в конструкторе.

Извини, не соглашусь. Погугли на тему "с++ исключение в конструкторе". Или есть такая книга Саттера "Решение сложных задач на С++". Я бы не стал говорить что лучше именно в конструкторе. Можно, но с головой. Это же относится и ко всему коду. В смысле если везде лепить блоки try/catch бездумно. Это вообще довольно сложная тема, и даже многие гуру до конца не понимают как это все работает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 20.5.2011, 22:08
Сообщение #7


Профессионал
*****

Группа: Модератор
Сообщений: 1609
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


по-моему, использование исключения в конструкторе - нормальная практика. ошибки и утечки тут могут быть только из-за невнимательности программиста.
собственно, конструктор вообще не может вернуть ничего, кроме исключения, в случае ошибки. так что это нормально.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 6.6.2011, 16:52
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


обработка исключений вообще платформозависимая тема (в плане реализации на нативном коде)
Но по сути она куда более сложна чем возврат кодов состояния.


Цитата
конструктор вообще не может вернуть ничего, кроме исключения, в случае ошибки. так что это нормально.


Можно возвращать значения по указателям и ссылкам, например.

Что я хотел сказать - исключения более ресурсоемкие по сравнению с возвращением кодов состояния. Лично я использую их в тех местах, где надо сделать что-то вроде транзакции. Так они более эффективны.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 6.6.2011, 23:10
Сообщение #9


Профессионал
*****

Группа: Модератор
Сообщений: 1609
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(PAFOS @ 6.6.2011, 19:52) *
Что я хотел сказать - исключения более ресурсоемкие по сравнению с возвращением кодов состояния.

собственно, обычно исключения - это именно исключения :)
конечно, в медленных приложениях их иногда юзают как метод разруливания сложных алгоритмических скачков, но я их предпочитаю использовать именно для обработки ошибок: то есть, когда уже произошёл какой-то генеральный кикоз и надо откатывать всю последовательность и производить какое-то восстановление состояния. кстати, ещё неясно, что быстрее и проще - вернуть из какой-нибудь десятой вложенности стопицот кодов ошибок или кинуть исключение. это точно так же приведёт к работе со стеком.

Сообщение отредактировал Iron Bug - 6.6.2011, 23:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 17.8.2022, 8:05