6.1 Intencjonalne uruchamianie wyjątków
W Pythonie możesz celowo uruchamiać wyjątki, używając operatora raise. Pozwala to sygnalizować wystąpienie błędu lub nieprawidłowej sytuacji w twoim programie. Przeanalizujmy różne sposoby użycia operatora raise i przepakowywania wyjątków.
Uruchamianie standardowych wyjątków
Ogólna składnia takiej operacji wygląda następująco:
raise exception
Możesz uruchamiać standardowe wyjątki, takie jak Exception, TypeError i inne, przekazując im odpowiadające komunikaty.
Przykład: raise Exception
def check_number(value):
if value < 0:
raise Exception("Sorry, no numbers below zero")
try:
check_number(-5)
except Exception as e:
print(f"Złapany wyjątek: {e}")
W tym przykładzie, jeśli wartość jest mniejsza od zera, uruchamiany jest Exception z komunikatem "Sorry, no numbers below zero".
Przykład: raise TypeError
def check_integer(value):
if not isinstance(value, int):
raise TypeError("Only integers are allowed")
try:
check_integer("string")
except TypeError as e:
print(f"Złapany wyjątek: {e}")
W tym przykładzie, jeśli wartość nie jest liczbą całkowitą, uruchamiany jest TypeError z komunikatem "Only integers are allowed".
6.2 Przepakowywanie wyjątków
Czasami konieczne jest przechwycenie jednego wyjątku i uruchomienie innego, dostarczając bardziej szczegółowe lub przydatne informacje. Można to zrobić za pomocą operatora raise ... from, który zachowuje oryginalny wyjątek jako przyczynę dla nowego.
Ogólna składnia takiej operacji wygląda następująco:
raise nowy_exception from stary_exception
Przykład: Przepakowywanie wyjątków
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("The variable is empty")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("Empty variable detected") from e
W tym przykładzie, jeśli wartość zmiennej jest pusta, najpierw uruchamiany jest ValueError z komunikatem "The variable is empty". Ten wyjątek jest następnie przechwytywany, a nowy wyjątek EmptyVariableError uruchamiany jest z komunikatem "Empty variable detected", przy czym oryginalny wyjątek jest przekazywany za pomocą from.
6.3 Analiza przepakowanych wyjątków
Użycie operatora raise ... from pozwala zachować informacje o łańcuchu wyjątków, co może być przydatne do debugowania. Możesz analizować przepakowane wyjątki i ich przyczyny.
Przykład analizy przepakowanych wyjątków:
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("The variable is empty")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("Empty variable detected") from e
Uruchomienie powyższego kodu prowadzi do następującego wyniku:
Traceback (most recent call last): File "example.py", line 8, in
check_non_empty("") File "example.py", line 5, in check_non_empty raise ValueError("The variable is empty") ValueError: The variable is empty
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File "example.py", line 10, in
raise EmptyVariableError("Empty variable detected") from e EmptyVariableError: Empty variable detected
Pierwszy błąd (zaznaczony na zielono) — to oryginalny błąd, który wystąpił gdzieś głęboko w kodzie. Czasami takie błędy występują od czasu do czasu i jest to normalne zachowanie programu.
Drugi błąd (zaznaczony na niebiesko) — to już błąd na wyższym poziomie. Twój program lub framework powinien wiedzieć, jak sobie z nim poradzić. A jeśli chcesz zgłębić temat i dowiedzieć się, co jest przyczyną błędu, wtedy właśnie zielony błąd przychodzi z pomocą.
Wszystko zrobione bardzo rozsądnie.
GO TO FULL VERSION