обработка исключений — поймать ошибку MySQL в переполнении стека

В C ++ я использую mysql.h библиотеки и мне не удается отловить ошибки MySQL (например, неудача вставки из-за конфликта в первичном ключе).

я пытался

#include <mysql.h>
// ...
try{
res = mysql_perform_query(conn, sqlIn);
} catch (...) {
// ...
}

но все равно не избежать прерывания с помощью:

MySQL query error : Duplicate entry

Я запускаю скомпилированную программу c ++ с использованием интерфейса PuTTy, и когда программа прерывается, она воспроизводит ошибку MySQL (независимо от того, использую ли я TRY CATCH или нет).
Я не нашел никаких ссылок на конкретные коды исключений для использования MySQL с оператором catch.

Судя по всему, C ++ (с использованием этой библиотеки mysql.h) не отлавливает ошибки обратного вызова MySQL даже с синтаксисом «blanket» (catch (...)). Поскольку этот синтаксис должен перехватывать ВСЕ исключения, но не в этом случае, я затрудняюсь понять, что здесь происходит. Как я могу поймать исключения SQL?

1

Решение

Библиотека mysql C не выдает никаких исключений; он просто, как и большинство других библиотек C, устанавливает информацию об ошибке в общем месте (например, errno) и возвращает статус. Это зависит от вашего клиентского кода, чтобы проверить возврат и выдать ошибку / исключение.

Если вам нужно легко решить проблему, попробуйте mysql ++ (AKA mysqlpp).
Это часть программного обеспечения, за которую я могу поручиться; твердый как камень!
http://tangentsoft.net/mysql++/

5

Другие решения

Попробуйте использовать какую-нибудь оболочку c ++ вокруг библиотеки mysql C. например http://mysqlcppapi.sourceforge.net/

C не генерирует исключения, которые вы должны проверить с помощью функции mysql_errorno.

2

Я не буду предлагать библиотеки Mysql C ++ по двум причинам
1. Трудно получить поддержку.
2. Медленный по сравнению с библиотекой Mysql C

Вы можете использовать API mysql_error () и mysql_errno (), чтобы узнать об ошибках и вручную через исключения

1

Согласно предложению Кингстониана, я использовал оболочку mysql ++ вокруг mysql (для установки в Ubuntu, см. мой рецепт, отвечая на другой вопрос так)

приведенный ниже код использовался для проверки обработки ошибок, когда в ключе было вставлено повторяющееся значение (Id_Target = 9). адаптироваться к вашим собственным потребностям, используя соответствующую вставку для вашей структуры БД.

#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include </usr/include/mysql++/mysql++.h>// sudo g++ -o /temp/zdelMySQLpp01c $(mysql_config --cflags) /home/ubuntu/zdelMySQLpp01c.cpp $(mysql_config --cflags --libs) -l pthread -std=c++0x -g -L/usr/lib/mysql -lmysqlclient -lmysqlpp

using namespace mysqlpp;
using namespace std;

//MySQL type
struct connection_details {
char *server;
char *user;
char *password;
char *database;
};

int main(int argv, char** argc){

// MySQL connection (global)
struct connection_details mysqlD;
mysqlD.server = (char *)"localhost";  // where the mysql database is
mysqlD.user = (char *)"root";       // the root user of mysql
mysqlD.password = (char *)"XXXXXX"; // the password of the root user in mysql
mysqlD.database = (char *)"test";   // the databse to pick

// connect to the mysql database
mysqlpp::Connection conn(false);
if (conn.connect(mysqlD.database, mysqlD.server, mysqlD.user, mysqlD.password)) {
//printf("ALOALO funcionou conexao\n");
mysqlpp::Query query = conn.query("INSERT INTO test.target (Id_Target, Ds_Target, Ds_Target_Name, Ds_Target_PWD, Ds_Target_Email, Ds_Target_Icon) VALUES ('9', 'test', 'name', 'pass', 'email', NULL)");
if (mysqlpp::StoreQueryResult res = query.store()) {
cout << "We have:" << endl;
for (size_t i = 0; i < res.num_rows(); ++i) {
cout << '\t' << res[i][0] << endl;
}
} else {
cerr << "Failed to get item list: " << query.error() << endl;
return 1;
}
return 0;
}
}
1
По вопросам рекламы [email protected]