Prenons l'extrait de code suivant qui manque un peu de robustesse :
try:
connexion = sqlite3.connect('mabd.db')
...
except sqlite3.OperationalError as e:
...
except Exception as e:
...
finally:
connexion.close()
Deux problèmes se posent :
Voyons comment régler ces problèmes.
Par défaut, la fonction sqlite3.connect() créera une base de données vide si la base de données demandée n'existe pas. Dans le jargon de SQLite, on dira que la BD est ouverte en mode "rwc" (Read Write Create).
Si ce comportement est souhaitable dans certaines situations précises, il ne n'est pas dans la majorité des situations.
Pour éviter cela, on ouvrira la base de données en mode "rw" (Read Write).
Ex :
connexion = sqlite3.connect('file:mabd.db?mode=rw', uri=True)
Si on tente d'ouvrir une base de données qui n'existe pas, une erreur de type sqlite3.OperationalError sera levée et pourra être interceptée grâce au try... except.
Si le branchement à la base de données ne fonctionne pas, une exception sera levée et attrapée par une clause except. Cependant, dans la clause finally, on tente de refermer la base de données mais puisque la variable de connexion n'a pas pu être créée, le programme plantera.
Pour contrer ce problème, nous allons :
Voici donc la version plus robuste de cet extrait de code :
try:
connexion = None
connexion = sqlite3.connect('file:mabd.db?mode=rw', uri=True)
...
except sqlite3.OperationalError as e:
if connexion is None:
print('La connexion à la base de données a échoué.')
else:
print('Il y a une erreur dans la requête SQL.')
traceback.print_exc(file=sys.stdout)
except Exception as e:
print('Une erreur inattendue est survenue.')
traceback.print_exc(file=sys.stdout)
finally:
if connexion is not None:
connexion.close()
Ou, si vous préférez :
try:
connexion = None
connexion = sqlite3.connect('file:mabd.db?mode=rw', uri=True)
...
except sqlite3.OperationalError as e:
if not connexion:
print('La connexion à la base de données a échoué.')
else:
print('Il y a une erreur dans la requête SQL.')
traceback.print_exc(file=sys.stdout)
except Exception as e:
print('Une erreur inattendue est survenue.')
traceback.print_exc(file=sys.stdout)
finally:
if connexion:
connexion.close()
▼Publicité