Blog JSystems - uwalniamy wiedzę!

Szukaj
Animacja raise - zgłaszanie własnego wyjątku
Gdy dane nie mają sensu, sami przerywamy działanie funkcji instrukcją raise

Przyjmijmy że mamy do zrealizowania program który będzie obliczał bmi na podstawie podanego wzrostu i masy:

def bmi(m,w):
    return round(m/pow(w,2),2)

print( bmi(80,1.76) )

Wymagane jest by wzrost został podany w metrach a masa w kilogramach. Gdyby ktoś podał wzrost w centymetrach, wynik działania tej funkcji będzie bzdurą choć wartość liczbowa zostanie zwrócona. Chcielibyśmy w jakiś sposób reagować na taką sytuację. Możemy rzucić ogólnym wyjątkiem w ten sposób:

def bmi(m,w):
    if w<1 or w>2.5:
        raise Exception
    return round(m/pow(w,2),2)

print( bmi(80,176) )

Taki wyjątek niewiele powie użytkownikowi naszej funkcji:

Traceback (most recent call last):
  File "D:/data/workspace-python/python_sredniozaawansowany/main.py", line 6, in <module>
print( bmi(80,176) )
  File "D:/data/workspace-python/python_sredniozaawansowany/main.py", line 3, in bmi
raise Exception
Exception

Wywołując wyjątek ogólny możemy przez argument konstruktora podać treść wyjątku:

def bmi(m,w):
    if w<1 or w>2.5:
        raise Exception('Wzrost poza zakresem')
    return round(m/pow(w,2),2)

print( bmi(80,176) )

Wynik działania:

Traceback (most recent call last):
  File "D:/data/workspace-python/python_sredniozaawansowany/main.py", line 6, in <module>
print( bmi(80,176) )
  File "D:/data/workspace-python/python_sredniozaawansowany/main.py", line 3, in bmi
raise Exception('Wzrost poza zakresem')
Exception: Wzrost poza zakresem

Co jednak jeśli zechcielibyśmy stworzyć własną klasę wyjątku która byłaby reużywalna? Musimy stworzyć własną klasę dziedziczącą po klasie Exception by następnie wywołać tak stworzony wyjątek:

class HeightOutOfRangeException(Exception):
    def __init__(self):
        super().__init__('Wzrost poza zakresem')

def bmi(m,w):
    if w<1 or w>2.5:
        raise HeightOutOfRangeException
    return round(m/pow(w,2),2)

print( bmi(80,176) )

W __init__ przekazujemy argument dla funkcji __init__ klasy po której dziedziczy - tj. Exception.

Wynik działania:

Traceback (most recent call last):
  File "D:/data/workspace-python/python_sredniozaawansowany/main.py", line 10, in <module>
print( bmi(80,176) )
  File "D:/data/workspace-python/python_sredniozaawansowany/main.py", line 7, in bmi
    raise HeightOutOfRangeException
__main__.HeightOutOfRangeException: Wzrost poza zakresem.

Możemy również do wyjątku przekazać jakąś informację. W tym przypadku będzie to wzrost:

class HeightOutOfRangeException(Exception):
    def __init__(self,w):
        super().__init__(f'Wzrost poza zakresem. Podany wzrost: {w}')

def bmi(m,w):
    if w<1 or w>2.5:
        raise HeightOutOfRangeException(w)
    return round(m/pow(w,2),2)

print( bmi(80,176) )

Wynik działania:

Traceback (most recent call last):
  File "D:/data/workspace-python/python_sredniozaawansowany/main.py", line 10, in <module>
print( bmi(80,176) )
  File "D:/data/workspace-python/python_sredniozaawansowany/main.py", line 7, in bmi
    raise HeightOutOfRangeException(w)
__main__.HeightOutOfRangeException: Wzrost poza zakresem. Podany wzrost: 176
Szkolenie Python od podstaw, przez analizę danych, do machine learning w JSystems

Ten kurs daje Ci solidne podstawy Pythona. Jeśli chcesz pójść dalej i pod okiem trenera dojść od pierwszej linijki kodu do własnego modelu uczenia maszynowego, sprawdź nasze pięciodniowe szkolenie Python od podstaw, przez analizę danych, do machine learning. Pierwsze trzy dni to Python w praktyce: typy i kolekcje, instrukcje warunkowe i pętle, funkcje, moduły i pakiety, pliki tekstowe, usługi sieciowe oraz praca z bazą PostgreSQL. Czwarty dzień to analiza danych w pandas (wczytywanie CSV, TSV i XLS, filtrowanie, agregacje, statystyki) i wizualizacja w Matplotlib, Seaborn oraz Plotly. Piąty dzień to uczenie maszynowe w scikit-learn: regresja liniowa i logistyczna, drzewa decyzyjne, las losowy, XGBoost, walidacja predykcji, dobór hiperparametrów i przeciwdziałanie przeuczeniu. Szkolenie ma terminy gwarantowane, czyli odbywa się niezależnie od wielkości grupy.

Szkolenie Python od podstaw, przez analizę danych, do machine learning

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Do czego służy instrukcja raise w Pythonie?
Instrukcja raise pozwala samodzielnie przerwać działanie funkcji, gdy dane nie mają sensu - na przykład gdy wzrost do wyliczenia BMI podano poza dopuszczalnym zakresem. Bez niej funkcja zwróciłaby wartość liczbową, która byłaby bezsensowna, mimo że technicznie poprawna.
Jak przekazać czytelny komunikat w wyjątku ogólnym?
Wywołując wyjątek ogólny, można przez argument konstruktora podać treść komunikatu, na przykład raise Exception(...) z opisem błędu. Dzięki temu użytkownik funkcji dostaje jasną informację, co poszło nie tak, zamiast samego surowego zgłoszenia bez opisu.
Jak stworzyć własną klasę wyjątku?
Tworzymy klasę dziedziczącą po klasie Exception i w metodzie __init__ wywołujemy konstruktor klasy nadrzędnej z treścią komunikatu. Tak przygotowany wyjątek można wielokrotnie zgłaszać instrukcją raise w różnych miejscach kodu, co daje reużywalny, nazwany typ błędu.
Czy do własnego wyjątku można przekazać dodatkowe dane?
Tak. W metodzie __init__ klasy wyjątku można przyjąć argument, na przykład podany wzrost, i wpleść go w treść komunikatu. Wtedy w miejscu zgłoszenia przekazujemy tę wartość, a komunikat błędu zawiera konkretne dane, które pomagają zrozumieć przyczynę problemu.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...