INF.04 · C# · lekcja 16

Obsługa wyjątków (try, catch, throw, finally)

Błąd nie musi kończyć programu

  • Zrozum
  • Sprawdź
  • Napisz sam

Po tej lekcji: błąd nie musi kończyć programu

Dzisiaj zrobisz konkretną rzecz

Prawdziwe aplikacje, z jakimi zetkniesz się na egzaminie i w pracy, muszą działać niezawodnie nawet przy błędnych danych wejściowych — program, który "wywala się" na pierwszym literówce użytkownika, nie nadaje się do użytku. Obsługa wyjątków to profesjonalny standard, którego oczekuje się w każdym poważniejszym kodzie.

Kiedy aplikacja bankowa pokazuje komunikat "Nieprawidłowy format numeru karty" zamiast się zawiesić, właśnie działa mechanizm try-catch — program WYKRYŁ problem i zareagował w kontrolowany sposób, zamiast ulec awarii.

Sprawdź w działaniu

Błąd nie musi kończyć programu

Najpierw przewidź wynik. Zmień dane w modelu i porównaj efekt. Spróbuj także przypadku granicznego, a nie tylko pierwszego poprawnego przykładu.

Ta interakcja wymaga włączonego JavaScriptu.

Model pokazuje wybraną zasadę. Nie uruchamia ani nie ocenia wklejonego kodu C#.

1. Przygotuj i uruchom własny projekt

2. Najpierw mały przykład

Wykonaj tę próbę przed dłuższym rozwiązaniem. try obejmuje ryzykowną operację. catch wybiera pasujący typ wyjątku. finally wykonuje porządkowanie także po obsłużonym błędzie. Do zwykłego sprawdzania danych użytkownika często wygodniejsze jest TryParse.

Program.cscsharp
try
{
    int wynik = int.Parse("abc");
    Console.WriteLine(wynik);
}
catch (FormatException)
{
    Console.WriteLine("Niepoprawna liczba");
}
finally
{
    Console.WriteLine("Koniec próby");
}
Wynik
Niepoprawna liczba
Koniec próby
  1. Co sprawdzić? Zmień jedną wartość i przed uruchomieniem zapisz przewidywany rezultat. Porównaj go z opisem wyniku; przy błędzie wróć do konkretnej instrukcji.

Jak to działa — 1

Do tej pory zakładaliśmy, że program zawsze dostaje poprawne dane. W praktyce użytkownik może wpisać tekst zamiast liczby, plik może nie istnieć, dzielenie może wystąpić przez zero. Bez obsługi błędów każda taka sytuacja "wywala" (crashuje) cały program. Wyjątki to mechanizm C# do BEZPIECZNEGO reagowania na takie sytuacje.

Wyjątek (Exception) to obiekt reprezentujący błąd, który wystąpił w trakcie działania programu — np. DivideByZeroException (dzielenie przez zero), IndexOutOfRangeException (indeks poza zakresem tablicy, Lekcja 8), FormatException (nieudana konwersja tekstu na liczbę), FileNotFoundException (brak pliku, Lekcja 9).

Blok try-catch: try { kod, który może zgłosić błąd } catch (TypWyjatku e) { co zrobić w razie błędu } Jeśli w bloku try wystąpi błąd, program NATYCHMIAST przeskakuje do pasującego bloku catch, zamiast zakończyć działanie awaryjnie. Zmienna e (obiekt wyjątku) zawiera m.in. e.Message — tekstowy opis, co dokładnie poszło nie tak.

Jak to działa — 2

finally to opcjonalny blok wykonywany ZAWSZE po try/catch, niezależnie od tego, czy wystąpił błąd — używany np. do zamykania plików czy połączeń, które muszą zostać zwolnione bez względu na wynik.

throw pozwala Twojemu WŁASNEMU kodowi celowo zgłosić wyjątek, gdy wykryje sytuację, której nie da się sensownie kontynuować: if (wiek < 0) { throw new ArgumentException("Wiek nie może być ujemny"); }

3. Pełny przykład — czytaj od Main

Teraz zastąp Program.cs tym programem. Zanim uruchomisz, znajdź dane wejściowe, operację i miejsce prezentacji wyniku. W tym wariancie zachowujemy jawny Main. Nie wklejaj kilku pełnych programów do jednego pliku.

Program.cs — osobne uruchomieniecsharp
using System;

class Program
{
    static void Main()
    {
        Console.Write("Podaj swój wiek: ");
        string wejscie = "abc"; // symulacja błędnych danych od użytkownika

        try
        {
            int wiek = int.Parse(wejscie); // może zgłosić FormatException
            if (wiek < 0)
            {
                throw new ArgumentException("Wiek nie może być ujemny.");
            }
            Console.WriteLine("Twój wiek to: " + wiek);
        }
        catch (FormatException)
        {
            Console.WriteLine("Błąd: to nie jest poprawna liczba.");
        }
        catch (ArgumentException e)
        {
            Console.WriteLine("Błąd: " + e.Message);
        }
        finally
        {
            Console.WriteLine("Zakończono próbę odczytu wieku.");
        }

        Console.WriteLine("Program działa dalej, mimo błędu powyżej.");
    }
}
  1. Prześledź kod int.Parse(wejscie) zgłasza FormatException, gdy tekst nie da się zamienić na liczbę — dokładnie to symuluje ten przykład, wpisując na sztywno tekst "abc". Zwróć uwagę, że można mieć WIELE bloków catch dla różnych typów wyjątków — C# sprawdza je po kolei i wykonuje pierwszy pasujący. Blok finally wykonał się bez względu na to, czy błąd wystąpił — to jego kluczowa cecha.

Sprawdź, zanim przepiszesz cały program

Częsty błąd to "połykanie" wyjątków pustym blokiem catch { } bez żadnej reakcji — program pozornie działa dalej, ale problem znika bez śladu, co bardzo utrudnia późniejsze debugowanie. Drugi błąd: używanie try-catch do obsługi sytuacji, które powinny być sprawdzone WCZEŚNIEJ zwykłym warunkiem if (np. sprawdzanie if (dzielnik != 0) zamiast łapania DivideByZeroException) — wyjątki są kosztowne wydajnościowo i powinny obsługiwać sytuacje NIETYPOWE, nie codzienną logikę. Trzeci: zbyt ogólny catch (Exception e) łapiący WSZYSTKIE możliwe błędy naraz, zamiast precyzyjnie obsłużyć konkretne, spodziewane typy wyjątków.

Ćwiczenie z pomocą · samodzielna praca

4. Teraz Twoja zmiana

Napisz program próbujący podzielić dwie liczby (jedną z nich ustaw na 0) w bloku try-catch, przechwytujący DivideByZeroException.

Oczekiwany rezultat
Spełnij warunki polecenia. Zapisz wejście, otrzymany wynik i wyjaśnij, która część kodu za niego odpowiada.
Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź

Wróć do podstawowej formy oraz objaśnienia: try obejmuje ryzykowną operację. catch wybiera pasujący typ wyjątku. finally wykonuje porządkowanie także po obsłużonym błędzie. Do zwykłego sprawdzania danych użytkownika często wygodniejsze jest TryParse.

Krok 2 — pokaż podpowiedź

Zmień tylko część potrzebną do polecenia. Zachowaj działającą wersję przed zmianą i uruchamiaj po każdym małym etapie.

Krok 3 — pokaż podpowiedź

Sprawdź przypadek zwykły i graniczny; porównaj z regułą: Niepoprawna liczba Koniec próby

Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.

5. Sprawdź rozumienie, nie tylko uruchomienie

Dalej na swoim koncie

Rozgrzewki, quiz i zadania są w biurku ucznia.

Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.

Zaloguj się →
Źródła i dalsza nauka