我正在使用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;
}
答案 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的问题?