0%

Eine Python-Schnittstelle um die Datenbank legen · Übung

Nur einen bekannten Katalogkonflikt übersetzen

Dieselbe doppelte Ausleih-ID führt derzeit zu einem datenbankspezifischen Fehler:

checkout_item(connection, 501, 4, 17, '2026-08-26') -> IntegrityError: UNIQUE constraint failed: loans.id

Dieses Detail ist innerhalb des Datenbankmoduls nützlich. Aufrufender Code braucht die kleinere Zusage, dass die Ausleihe mit einer Katalogregel in Konflikt steht. Übersetze nur diese bekannte Grenze:

ValueError: The checkout conflicts with a catalog rule.

Öffne catalog_db.py. Umschließe den bestehenden Verbindungskontext mit try und fange dann genau sqlite3.IntegrityError ab, nachdem der Kontext verlassen wurde:

try:
    with connection:
        # Keep both checks and the insert here.
        ...
except sqlite3.IntegrityError:
    raise ValueError("The checkout conflicts with a catalog rule.")
return loan_id

Die Platzierung ist wichtig. Wenn ein Integritätsfehler with connection: verlässt, rollt der Verbindungskontext die Transaktion zurück. Erst dann ersetzt der äußere Handler den Fehler der tieferen Ebene. Innerhalb des Kontexts abzufangen würde den Block wie normal beendet aussehen lassen. Das kann Arbeit festschreiben, die zurückgerollt werden sollte.

Auch der Umfang ist wichtig. Fange weder Exception noch jedes sqlite3.Error ab. Eine nicht verfügbare Tabelle ist ein OperationalError; eine geschlossene Verbindung zu verwenden ist ein ProgrammingError. Das sind Defekte oder Betriebsprobleme, keine Belege dafür, dass eine Ausleihe eine Katalogregel verletzt hat. Sie müssen ihre ursprünglichen Typen behalten.

Auch die beiden früheren ValueError-Meldungen laufen unverändert weiter, weil dieser Handler nur IntegrityError abfängt:

That item is already checked out.
That member has reached the loan limit.

Klicke auf Run. Es wiederholt die exakten Erfolgs- und Duplikat-ID-Aufrufe, die du gerade gesehen hast. Die erfolgreiche Rückgabe und die dauerhaft gespeicherte Zeile bleiben gleich. Nur die Konfliktzeile ändert sich zum dokumentierten ValueError, und eine neue Verbindung findet weiterhin keinen Ausleihvorgang für Gegenstand 4. Die übergebene Verbindung bleibt verwendbar.

Submit verursacht außerdem einen fehlenden Fremdschlüssel, beide Anwendungsablehnungen, eine nicht verfügbare Tabelle, eine geschlossene Verbindung und unabhängige Python-Fehler. Übersetze die beiden Integritätskonflikte und lass alles andere seine tatsächliche Ursache zeigen.

Aufgabe

Aktualisiere checkout_item, sodass ein äußerer Handler genau sqlite3.IntegrityError abfängt, nachdem es with connection: verlassen hat, und ValueError("The checkout conflicts with a catalog rule.") auslöst.

Behalte beide regelspezifischen ValueError-Meldungen unverändert bei. Lass alle anderen Ausnahmetypen weiterlaufen, gib nach einem erfolgreichen Commit loan_id zurück und lass die übergebene Verbindung offen.