CodeGym /Kursy /Python SELF PL /Uruchamianie wyjątków

Uruchamianie wyjątków

Python SELF PL
Poziom 18 , Lekcja 0
Dostępny

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.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION