在sqlite3pp中捕获异常

时间:2015-04-14 11:40:12

标签: c++ exception sqlite

我正在使用sqlite3pp来操纵数据库。当我尝试通过运行在同一个表中两次插入一条记录时,

 sqlite3pp::command cmd(db, "INSERT INTO Groups (Name) VALUES (?)");
 cmd.binder() << "Group_one";
 cmd.execute();
它引起了一场哗然,并向我展示了这一点:

  

libc ++ abi.dylib:以未捕获的类型异常终止   sqlite3pp :: database_error:UNIQUE约束失败: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;
}

4 个答案:

答案 0 :(得分:1)

我是sqlite3pp的作者,很抱歉让你感到困惑。

当我写这篇文章的时候,我试着让它重量很轻。所以,我决定不将所有sqlite3错误代码翻译成c ++异常。

因此,结果是,方法具有整数类型返回值,这与sqlite3方法返回的完全相同的错误代码。因此,在这种情况下,您需要检查execute()的返回值。

但是,在某些地方,它无法返回错误代码。例如在ctor和dtor。对于这些地方,我介绍了database_error异常。

答案 1 :(得分:0)

我会尝试捕获消息的异常类型......

catch(sqlite3pp :: database_error&amp; ex) {  ... }

答案 2 :(得分: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) {}

答案 3 :(得分:0)

我遇到了同样的问题 - 无论我尝试什么,都无法捕捉到异常。然而,经过一些挖掘后,我发现C ++ 11默认情况下声明析构函数为noexcept。我正在使用C ++ 11,并且能够通过对sqlite3pp代码进行以下更改来“修复”该问题:

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

那么,或许这是OP的问题?