Obsługa wyjątków

Obsługa wyjątków w Pythonie

Wyjątki to błędy, które mogą wystąpić podczas wykonywania programu. Python pozwala na ich obsługę, aby program nie przerywał działania.

Podstawowa obsługa wyjątków:

Używamy bloków try i except:

try:
    number = 0  # Symulujemy problematyczną wartość
    result = 10 / number
    print(f"Wynik: {result}")
except:
    print("Wystąpił błąd!")

Obsługa konkretnych wyjątków:

try:
    number = 0  # Dzielenie przez zero
    result = 10 / number
    print(f"Wynik: {result}")
except ValueError:
    print("To nie jest liczba!")
except ZeroDivisionError:
    print("Nie można dzielić przez zero!")
except Exception as e:
    print(f"Wystąpił nieoczekiwany błąd: {e}")

# Przykład z ValueError
try:
    number = int("abc")  # Próba konwersji tekstu na liczbę
    print(number)
except ValueError:
    print("To nie jest liczba!")

Najczęstsze typy wyjątków:

  • ValueError – nieprawidłowa wartość
  • TypeError – nieprawidłowy typ danych
  • ZeroDivisionError – dzielenie przez zero
  • IndexError – indeks poza zakresem
  • KeyError – klucz nie istnieje w słowniku
  • FileNotFoundError – plik nie istnieje

Blok else i finally:

try:
    number = 5  # Prawidłowa wartość
    result = 10 / number
except ValueError:
    print("To nie jest liczba!")
except ZeroDivisionError:
    print("Nie można dzielić przez zero!")
else:
    # Wykonuje się tylko jeśli nie było wyjątku
    print(f"Wynik: {result}")
finally:
    # Wykonuje się zawsze, niezależnie od wyjątku
    print("Koniec programu")

# Przykład z wyjątkiem
try:
    number = 0  # Będzie błąd
    result = 10 / number
except ZeroDivisionError:
    print("Nie można dzielić przez zero!")
else:
    print(f"Wynik: {result}")
finally:
    print("Koniec programu")

Rzucanie wyjątków:

Możesz samodzielnie rzucać wyjątki używając raise:

def check_age(age):
    if age < 0:
        raise ValueError("Wiek nie może być ujemny!")
    elif age > 150:
        raise ValueError("Wiek jest nieprawdopodobny!")
    else:
        print(f"Wiek: {age}")

try:
    check_age(-5)
except ValueError as e:
    print(f"Błąd: {e}")

try:
    check_age(200)
except ValueError as e:
    print(f"Błąd: {e}")

Własne wyjątki:

class TooYoungError(Exception):
    pass

def check_driving_age(age):
    if age < 18:
        raise TooYoungError("Musisz mieć 18 lat, żeby prowadzić samochód!")
    else:
        print("Możesz prowadzić samochód!")

try:
    check_driving_age(16)
except TooYoungError as e:
    print(f"Błąd: {e}")

Przykłady praktyczne:

# Obsługa dostępu do listy
fruits = ["jabłko", "banan", "pomarańcza"]

try:
    print(fruits[5])  # Indeks poza zakresem
except IndexError:
    print("Indeks poza zakresem listy!")

# Obsługa dostępu do słownika
person = {"name": "Jan", "age": 30}

try:
    print(person["city"])  # Klucz nie istnieje
except KeyError:
    print("Klucz nie istnieje w słowniku!")

# Bezpieczniejszy sposób
city = person.get("city", "Nieznane")
print(f"Miasto: {city}")

Dobre praktyki:

  • Zawsze obsługuj konkretne wyjątki, nie używaj pustego except
  • Używaj finally do czyszczenia zasobów
  • Nie ukrywaj błędów – loguj je lub wyświetlaj użytkownikowi
  • Używaj raise do przekazywania wyjątków dalej

Ćwiczenie:

Napisz program z obsługą różnych typów wyjątków.

Brak odpowiedzi

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *