2015-04-14 4 views
1

Я использую sqlite3pp для управления базой данных. Когда я попытался вставить одну запись дважды в одной и той же таблицы, запустивИсключение catch в sqlite3pp

sqlite3pp::command cmd(db, "INSERT INTO Groups (Name) VALUES (?)"); 
cmd.binder() << "Group_one"; 
cmd.execute(); 

он бросил в excpetion и показал мне это:

libc++abi.dylib: terminating with uncaught exception of type sqlite3pp::database_error: UNIQUE constraint failed: Groups.Name

Но я не уверен, какой тип исключения я должен использовать, чтобы поймать? Я попытался

try { 
    cmd.execute(); 
} catch (std::exception& ex) {} 

или

try { 
    cmd.execute(); 
} catch (sqlite3pp::database_error& ex) {} 

или

try { 
    cmd.execute(); 
} catch (...) {} 

Но ни один из них не работает. Может ли кто-нибудь помочь мне здесь? Благодаря!

Вот мой код:

#include <iostream> 
#include "sqlite3pp.h" 

int main(int argc, const char * argv[]) { 
    sqlite3pp::database db("./test.db"); 

    // Create table 
    db.execute("CREATE TABLE IF NOT EXISTS Groups(" \ 
       "Name TEXT PRIMARY KEY)"); 

    sqlite3pp::command cmd(db, "INSERT INTO Groups (Name) VALUES (?)"); 
    cmd.binder() << "Group_one"; 

    try { 
     cmd.execute(); // When I run this code twice, the exception is thrown because of UNIQUE constraint. 
    } catch (std::exception& ex) { 
     std::cout << "exception: " << ex.what() << std::endl; 
    } 

    std::cout << "Done" << std::endl; 
    return 0; 
} 

ответ

0

Я бы попытаться поймать тип исключения сообщения ...

улов (sqlite3pp :: DATABASE_ERROR & ех) { ... }

+0

Это тоже не работает. – wking

0

Я изучил код и в тестах разработчики использовали такой код:

#include "sqlite3pp.h" 
try 
{ 
    sqlite3pp::command cmd(...); 
    cmd.execute(); 
} 
catch (exception& ex) { // Note they use a reference here "exception&" 
    cout << ex.what() << endl; 
} 

так, вы должны использовать то же самое, если это не работает, либо, попытаться поймать все с помощью:

try { 
    cmd.execute(); 
} catch (...) {} // Using the ... should fix the error, but I recomend you to find the correct exception you have to catch. 

Глядя на код ближе

Я нашел класс (в sqlite3pp.h):

class database_error : public std::runtime_error 
{ 
    public: 
    explicit database_error(char const* msg); 
    explicit database_error(database& db); 
}; 

Таким образом, вы должны решить эту проблему с помощью:

try { 
    cmd.execute(); 
} catch (database_error &e) {} 
+0

Даже catch (...) не будет работать. Я действительно смущен. – wking

+0

wow !!, это очень странно. Единственное, что приходит мне в голову, это то, что исключение происходит из другого места в вашем коде. –

+0

Я отправляю свой код уже, это довольно просто. Но я просто не могу понять. – wking

0

Я автор sqlite3pp и сожалею, что смутил вас.

Когда я написал это, я попытался сделать его очень легким. Итак, я решил не переводить все коды ошибок sqlite3 в исключения C++.

Итак, в результате методы имеют возвращаемое значение целочисленного типа, которое является тем же кодом ошибки, что и методы sqlite3. Итак, в этом случае вам нужно проверить возвращаемое значение execute().

Но в некоторых местах он не может вернуть код ошибки. например в ctor и dtor. Для этих мест я ввел исключение database_error.

+0

Спасибо, что ответили. Теперь я понял. Может быть, перевести коды ошибок в исключения C++. Но это только для меня. – wking

0

У меня была эта же проблема - не удалось поймать исключение, независимо от того, что я пробовал. Однако после некоторого копания я обнаружил, что C++ 11 объявляет деструкторы не по умолчанию.Я использую C++ 11 и был в состоянии «исправить» проблему, сделав следующее изменение в код sqlite3pp:

~transaction() noexcept(false); 
transaction::~transaction() noexcept(false) 

Таким образом, возможно, это вопрос ОП был?

Смежные вопросы