Gestion des erreurs
La gestion des erreurs dans les scripts SQL, les procédures stockées, ou les déclencheurs est cruciale pour maintenir l'intégrité de la base de données et assurer un traitement approprié des données. On utilise des gestionnaires d'erreurs (HANDLERs) pour intercepter les erreurs, et la commande SIGNAL
pour générer des erreurs personnalisées.
HANDLER
Un handler permet de gérer les erreurs ou conditions spécifiques qui surviennent dans un bloc SQL.
Syntaxe
DECLARE handler_action HANDLER FOR condition_value statement;
- handler_action : Définit si l'exécution doit continuer (
CONTINUE
) ou se terminer (EXIT
) après l'interception de l'erreur. - condition_value : Spécifie l'erreur à intercepter. Peut être un
mysql_error_code
, unSQLSTATE value
, ou une condition nommée préalablement définie.
Exemples de conditions
mysql_error_code
: Code d'erreur MySQL spécifique.SQLSTATE value
: Code d'état SQL à cinq caractères.condition_name
: Nom de condition associé à un code d'erreur ou d'état.SQLWARNINGS
: Pour les avertissements SQLSTATE commençant par '01'.NOT FOUND
: Utilisé pour gérer les situations où une requête ne retourne pas de résultat.SQLEXCEPTION
: Pour les erreurs SQLSTATE ne commençant pas par '00', '01', ou '02'.
Exemple d'utilisation
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 'Une erreur est survenue, les opérations ont été annulées.';
END;
SIGNAL
SIGNAL
est utilisé pour générer une erreur ou un état qui interrompt l'exécution du script.
Syntaxe
SIGNAL SQLSTATE VALUE 'erreur_code' SET signal_information_item = value;
- SQLSTATE : Utilisé généralement avec '45000' pour indiquer une erreur définie par l'utilisateur.
- signal_information_item : Permet de définir des informations supplémentaires sur l'erreur, comme
MESSAGE_TEXT
.
Exemple
IF (nombre < 0) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'La valeur doit être supérieure à 0';
END IF;
Intégration avec des Handlers
Combinez SIGNAL
et HANDLER
pour gérer finement les erreurs dans vos procédures :
Exemple avec Handler
CREATE PROCEDURE exemplebd.test_error(nombre INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '45000'
BEGIN
SELECT 'La valeur doit être supérieure à 0' AS message_erreur;
END;
IF (nombre <= 0) THEN
SIGNAL SQLSTATE '45000';
END IF;
SELECT nombre;
END;
Gestion d'erreurs dans les applications clientes
Les erreurs générées par SIGNAL
peuvent être capturées et gérées dans les applications clientes, comme avec Python en utilisant MySQL Connector :
import mysql.connector as mysql
def TestError():
try:
connection = mysql.connect(**db_config)
cursor = connection.cursor()
cursor.callproc('test_error', [-2])
for result in cursor.stored_results():
print(result.fetchall())
except mysql.Error as err:
print('Erreur interceptée:', err.msg)
finally:
if connection.is_connected():
cursor.close()
connection.close()
TestError()