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