Blog JSystems - z miłości do programowania

Tworzenie własnych wyjątków



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


 

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!