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.
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.
try
{
int wynik = int.Parse("abc");
Console.WriteLine(wynik);
}
catch (FormatException)
{
Console.WriteLine("Niepoprawna liczba");
}
finally
{
Console.WriteLine("Koniec próby");
}
Niepoprawna liczba Koniec próby
- 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.
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.");
}
}
- Prześledź kod
int.Parse(wejscie)zgłaszaFormatException, 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ówcatchdla różnych typów wyjątków — C# sprawdza je po kolei i wykonuje pierwszy pasujący. Blokfinallywykonał 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.
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ę →