0%

Meerdere wijzigingen, één uitkomst

Herken een constraintfout

De mislukte aanroep van checkout_pair stopte bij de tweede insert. De twee waarnemingen kwamen niet overeen:

Acting connection pending new loan IDs: [7101]
Fresh connection new loan IDs: []
Transaction still open: yes

De eerste rij wacht nog op afronding op de verbinding die haar probeerde in te voegen. Ze is nooit gecommit, dus een nieuwe verbinding kan haar niet zien. De mislukte tweede instructie heeft niet bepaald wat er met die wachtende eerste rij moet gebeuren.

SQLite meldt een geschonden primaire of verwijzende sleutel met sqlite3.IntegrityError. Een korte aanroeper die de uitkomst bekijkt, kan dat specifieke geval zo herkennen:

try:
    checkout_pair(connection, first_loan, missing_member_loan)
except sqlite3.IntegrityError:
    print("The database rejected a catalog rule conflict.")

De exception vertelt de aanroeper waarom de instructie stopte. De exception opvangen of benoemen legt eerder werk niet vanzelf vast en draait het ook niet terug. De vaste demonstratie draait pas terug na het afdrukken van de wachtende toestand, zodat de tijdelijke database kan worden opgeruimd. Je functie heeft dat foutgedrag nog niet.

Het exceptiontype geeft ons ook een nuttige grens. Een ontbrekende tabel veroorzaakt OperationalError. Een onbruikbaar argument doorgeven kan TypeError veroorzaken. Die fouten betekenen niet “een bekende catalogusconstraint heeft deze rij geweigerd”, dus een handler voor deze bewerking moet niet Exception of elke sqlite3.Error opvangen.

Welke exception moet het volgende foutpad van de uitleen afhandelen bij een dubbel uitleen-ID of een ontbrekend bovenliggend ID?

Nu kun je die verwachte exception één expliciete uitkomst geven: draai het wachtende deel van het paar terug en geef False terug.