jesteś tutaj�
453
Obsługa wyjątków
Zgłaszanie wyjątku SQLError
Na tym etapie masz już dodaną klasę
SQLError
w pliku DBcm.py, co pokazano poniżej.
import mysql.connector
class ConnectionError(Exception):
pass
class CredentialsError(Exception):
pass
class SQLError(Exception):
pass
class UseDatabase:
def __init__(self, config: dict) -> None:
self.configuration = config
...
To jest miejsce, w którym
dodałeś wyjątek SQLError.
def __exit__(self, exc_type, exc_value, exc_traceback):
self.conn.commit()
self.cursor.close()
self.conn.close()
if exc_type is mysql.connector.errors.ProgrammingError:
raise SQLError(exc_value)
...
self.conn.close()
if exc_type is mysql.connector.errors.ProgrammingError:
raise SQLError(exc_value)
elif exc_type:
raise exc_type(exc_value)
Jeśli wystąpi błąd
ProgrammingError, zgłoś
wyjątek SQLError.
Ta instrukcja elif zgłasza
każdy inny wyjątek, który
mógłby wystąpić.
Mając zdefiniowaną klasę
SQLError
, musisz już tylko dodać trochę kodu do metody
__exit__
,
za pomocą którego sprawdzisz, czy wartość argumentu
exc_type
wskazuje interesujący Cię wyjątek,
a jeśli tak właśnie będzie, zgłosisz wyjątek
SQLError
. Zadanie to jest tak proste, że oparliśmy
się występującemu zwykle w serii
Rusz głową! przymusowi przekształcenia procesu tworzenia
wymaganego kodu w ćwiczenie, ponieważ nikt nie chce obrażać niczyjej inteligencji na tym etapie
lektury książki. Poniżej znajdziesz zatem kod, który powinieneś dołączyć do metody
__exit__
.
Jeśli chcesz się
dodatkowo zabezpieczyć
i zrobić coś sensownego z każdym innym, nieoczekiwanym
wyjątkiem przesłanym do metody
__exit__
, na końcu możesz dodać zestaw instrukcji
elif
, który
zgłosi niespodziewany wyjątek do wywołującego kodu, tak jak zostało to przedstawione poniżej.
454
Rozdział 11.
Nie ma już błędu ProgrammingError
...
Czy Twoje zapytanie jest poprawne? Błąd: 1146 (42S02): Table ‘vsearchlogdb.logerror’ doesn’t exist
127.0.0.1 - - [03/Jul/2017 10:02:58] ”GET /viewlog HTTP/1.1” 200 -
except ConnectionError as err:
print(‘Czy Twoja baza danych jest włączona? Błąd:’, str(err))
except CredentialsError as err:
print(‘Problemy z identyfikatorem użytkownika lub hasłem dostępu. Błąd:’, str(err))
except SQLError as err:
print(‘Czy Twoje zapytanie jest poprawne? Błąd:’, str(err))
except Exception as err:
print(‘Coś poszło źle:’, str(err))
return ‘Błąd’
Dodaj ten kod do
funkcji view_the_log
znajdującej się
w aplikacji
vsearch4web.py.
Do listy elementów importowanych z modułu DBcm nie zapomnij też dodać swojej nowej klasy wyjątku.
Podobnie, gdy stanie się coś niespodziewanego, kod przechwytujący wszystkie wyjątki, który dodaliśmy do
Twojej aplikacji, wkracza do akcji, wyświetlając odpowiedni komunikat.
...
Coś poszło źle: Jakiś nieznany wyjątek.
127.0.0.1 - - [03/Jul/2017 10:09:27] ”GET /viewlog HTTP/1.1” 200 -
Gdy dodasz już do swojej aplikacji WWW kod obsługi wyjątków, będzie ona kontynuowała swoje działanie
bez wyświetlania użytkownikom przerażającej lub dezinformującej strony błędu, niezależnie od tego, jaki błąd
czasu wykonania wystąpi.
Gdy dzieje się coś nieoczekiwanego,
Twój kod obsługuje również ten
problem.
Nie występują tu już ogólne wyjątki ProgrammingError
pochodzące z modułu MySQL Connector, ponieważ Twój
niestandardowy kod obsługi wyjątków przechwytuje te błędy.
A naprawdę fajną rzeczą jest tutaj to,
że kod ten przekształca ogólny wyjątek
ProgrammingError zapewniany przez moduł
MySQL Connector w dwa niestandardowe
wyjątki, które mają określone znaczenie dla
naszej aplikacji WWW.
Jazda próbna
Dodawszy obsługę wyjątku SQLError do pliku
DBcm.py
, dołóż kolejny zestaw klauzuli except do funkcji
view_the_log, aby przechwytywać wszystkie błędy typu SQLError, jakie się pojawiają.
Tak, to prawda. I daje nam to spore możliwości.
from DBcm import UseDatabase, ConnectionError, CredentialsError, SQLError
Gdy zapiszesz już swój plik
vsearch4web.py
, Twoja aplikacja WWW powinna się przeładować i być
gotowa do testów. Jeśli spróbujesz wykonać zapytanie SQL zawierające błędy, odpowiedni wyjątek
zostanie obsłużony przez powyższy kod, tak jak zostało to pokazane poniżej.
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.