Blog JSystems - uwalniamy wiedzę!

Szukaj

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

 

Komentarze (0)

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

Brak komentarzy...