jesteś tutaj�
443
Obsługa wyjątków
import mysql.connector
class UseDatabase:
def __init__(self, config: dict) -> None:
self.configuration = config
def __enter__(self) -> ‘cursor’:
self.conn = mysql.connector.connect(**self.configuration)
self.cursor = self.conn.cursor()
return self.cursor
def __exit__(self, exc_type, exc_value, exc_trace) -> None:
self.conn.commit()
self.cursor.close()
self.conn.close()
To jest kod
menedżera kontekstu
znajdujący się
w pliku DBcm.py.
Teraz, gdy widziałeś już
funkcję exc_info, powinno
być dla Ciebie jasne, do
czego odnoszą się te
argumenty; chodzi tu
o dane wyjątku.
Zrewidowany moduł DBcm
Do kodu modułu
DBcm
zaglądaliśmy po raz ostatni w
rozdziale 9.
, gdy go tworzyliśmy, aby umożliwić sobie
wykorzystywanie instrukcji
with
do działań związanych z bazą danych MySQL. Wówczas odłożyliśmy na bok
wszelkie kwestie związane z obsługą błędów (wygodnie ignorując cały ten problem). Teraz, gdy miałeś okazję się
przekonać, co oferuje Ci funkcja
sys.exc_info
, powinieneś mieć już nieco większe pojęcie o tym, co oznaczają
argumenty metody
__exit__
należącej do klasy
UseDatabase
. Raz jeszcze rzuć okiem na kod modułu
DBcm
.
Przypomnij sobie, że klasa
UseDatabase
implementuje trzy metody:
• metodę
__init__
, która zapewnia okazję do konfiguracji przed wykonaniem
instrukcji
with
;
• metodę
__enter__
, która zostaje wykonana, gdy instrukcja
with
zaczyna działać;
• metodę
__exit__
, która na pewno zostanie uruchomiona, gdy zestaw
instrukcji
with
się zakończy.
Tak przynajmniej wygląda spodziewany sposób działania, gdy wszystko idzie zgodnie z planem.
Gdy coś idzie nie tak, zachowanie to ulega
zmianie
.
Na przykład gdy podczas wykonywania metody
__enter__
zostanie zgłoszony wyjątek, instrukcja
with
jest przerywana, a wszelkie dalsze przetwarzanie metody
__exit__
zostaje anulowane. Ma
to sens: jeśli metoda
__enter__
„wpadnie w kłopoty”, w przypadku metody
__exit__
nie można
już zakładać, że kontekst wykonania został właściwie zainicjalizowany i skonfigurowany (dlatego
rozsądniej jest w ogóle nie uruchamiać kodu metody
__exit__
).
Głównym problemem związanym z kodem metody
__enter__
jest to, że używana w niej baza danych
może nie być dostępna, dlatego poświęćmy trochę czasu na zmodyfikowanie tej metody w taki
sposób, aby przygotować ją na tę ewentualność, generując własny wyjątek, gdy nie da się nawiązać
połączenia z bazą. Po zrobieniu tego zmienimy funkcję
view_the_log
tak, aby przechwytywała ten
nasz wyjątek zamiast wyjątku
mysql.connector.errors.InterfaceError
, bardzo specyficznego dla
zastosowanej bazy danych.
Get Python Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.