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)
Brak komentarzy...