Bouw een Python-interface rond de database · oefening
Zet alleen een bekend catalogusconflict om
Hetzelfde dubbele uitleen-ID leidt momenteel tot een databasespecifieke fout:
checkout_item(connection, 501, 4, 17, '2026-08-26') -> IntegrityError: UNIQUE constraint failed: loans.id
Dat detail is nuttig binnen de databasemodule. Voor de aanroeper volstaat de beperktere boodschap dat de uitleen in strijd is met een catalogusregel. Zet alleen deze bekende fout aan de modulegrens om:
ValueError: The checkout conflicts with a catalog rule.
Open catalog_db.py. Zet try om de bestaande verbindingscontext en vang vervolgens precies sqlite3.IntegrityError op nadat de context is verlaten:
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
De plaats is van belang. Wanneer een integriteitsfout het blok with connection: verlaat, draait de verbindingscontext de transactie terug. Pas daarna vervangt de buitenste handler de onderliggende fout. Als je de fout binnen de context opvangt, lijkt het blok normaal te eindigen. Daardoor kan werk worden gecommit dat had moeten worden teruggedraaid.
Ook de reikwijdte is van belang. Vang niet Exception of zelfs elke sqlite3.Error op. Een niet-beschikbare tabel veroorzaakt een OperationalError; het gebruik van een gesloten verbinding veroorzaakt een ProgrammingError. Dat zijn programmeerfouten of operationele problemen, geen bewijs dat een uitleen een catalogusconstraint schond. Ze moeten hun oorspronkelijke typen behouden.
De twee eerdere ValueError-meldingen gaan ook ongewijzigd door, omdat deze handler alleen IntegrityError opvangt:
That item is already checked out.
That member has reached the loan limit.
Druk op Run. Het herhaalt precies de geslaagde aanroep en de aanroep met het dubbele ID die je net zag. De geslaagde terugkeerwaarde en de blijvend opgeslagen rij blijven hetzelfde. Alleen de conflictregel verandert in de beschreven ValueError, en een nieuwe verbinding vindt nog steeds geen uitlening voor voorwerp 4. De meegegeven verbinding blijft bruikbaar.
Submit veroorzaakt ook een verwijzing naar een ontbrekend record, beide weigeringen van de applicatie, een niet-beschikbare tabel, een gesloten verbinding en losstaande Python-fouten. Zet de twee integriteitsconflicten om; laat alle andere fouten hun eigen oorzaak blijven tonen.
Opdracht
Werk checkout_item bij zodat één buitenste handler precies sqlite3.IntegrityError opvangt nadat die with connection: verlaat, en ValueError("The checkout conflicts with a catalog rule.") opwerpt.
Laat beide regelspecifieke ValueError-meldingen ongewijzigd. Laat alle losstaande exceptiontypen doorgaan, geef loan_id terug na een geslaagde commit en laat de meegegeven verbinding open.