def f():
    raise ValueError("Nie zostanę obsłużony")

try:
    print("Start")
    # odkomentuj wybrane linijki:
    # 1 // 0 # ZeroDivisionError
    # [][0] # IndexError
    # f() # ValueError rzucony explicite
    print("Koniec 'try'")
except IndexError:
    print(f"Padł wyjątek IndexError!")
except ZeroDivisionError as e:
    print(f"Padł wyjątek ZeroDivisionError z komunikatem '{e}'!")
else:
    print("Obyło się bez wyjątków")
finally:
    print("Zawsze się wykonam")
    
'''
Inne typowe wyjątki + przykład sytuacji:
TypeError:  zły typ parametru funkcji
ValueError: typ parametru ok, ale zła wartość
KeyError:   brak klucza w słowniku
'''
