Mehrere Änderungen, ein Ergebnis
Einen Verstoß gegen eine Datenbankregel erkennen
Der fehlschlagende Aufruf von checkout_pair brach bei seiner zweiten Einfügung ab. Seine beiden Ansichten stimmten nicht überein:
Acting connection pending new loan IDs: [7101]
Fresh connection new loan IDs: []
Transaction still open: yes
Die erste Zeile ist auf der Verbindung, die sie versucht hat, noch nicht festgeschrieben. Sie wurde nie bestätigt, also kann eine neue Verbindung sie nicht sehen. Die fehlgeschlagene zweite Anweisung hat nicht entschieden, was mit dieser noch offenen ersten Zeile geschehen soll.
SQLite meldet einen Verstoß gegen eine Primär- oder Fremdschlüsselregel mit sqlite3.IntegrityError. Ein kurzer beobachtender Aufrufer könnte genau diesen Fall so erkennen:
try:
checkout_pair(connection, first_loan, missing_member_loan)
except sqlite3.IntegrityError:
print("The database rejected a catalog rule conflict.")
Die Ausnahme sagt dem aufrufenden Code, warum die Anweisung abbrach. Sie abzufangen oder zu benennen schreibt frühere Arbeit nicht von selbst fest und macht sie auch nicht rückgängig. Die feste Demonstration führt erst nach der Ausgabe des offenen Zustands ein Rollback aus, damit ihre temporäre Datenbank aufgeräumt werden kann. Deine Funktion hat dieses Fehlerverhalten noch nicht.
Der Ausnahmetyp gibt uns außerdem eine nützliche Grenze. Eine fehlende Tabelle löst OperationalError aus. Ein unbrauchbares Argument zu übergeben kann TypeError auslösen. Diese Fehler bedeuten nicht „eine bekannte Katalogregel hat diese Zeile abgelehnt“, also sollte ein Handler für diese Operation weder Exception noch jedes sqlite3.Error abfangen.
Welche Ausnahme sollte der nächste Fehlerpfad der Ausleihe bei einer doppelten Ausleih-ID oder fehlenden übergeordneten ID behandeln?
Jetzt kannst du dieser erwarteten Ausnahme ein ausdrückliches Ergebnis geben: Mache den noch offenen Teil des Paares rückgängig und gib False zurück.