Blok finally
Część sekcji Logika i sterowanie przepływem ścieżki C# w Coddy. Lekcja 27 z 66.
Blok finally zawiera kod, który zawsze się wykonuje, niezależnie od tego, czy wystąpi wyjątek, czy nie — nawet jeśli w blokach try lub catch znajduje się instrukcja return.
Utwórz podstawową strukturę try-catch-finally:
try
{
// Kod, który może zgłosić wyjątek
int result = 10 / 2;
Console.WriteLine("Result: " + result);
}
catch (DivideByZeroException ex)
{
// Kod, który obsługuje wyjątek
Console.WriteLine("Cannot divide by zero: " + ex.Message);
}
finally
{
// Kod, który wykonuje się zawsze
Console.WriteLine("This always executes");
}
Blok finally jest przydatny do zadań porządkowych, takich jak zamykanie plików lub połączeń z bazą danych:
System.IO.StreamReader file = null;
try
{
file = new System.IO.StreamReader("data.txt");
string content = file.ReadToEnd();
Console.WriteLine(content);
}
catch (System.IO.FileNotFoundException)
{
Console.WriteLine("File not found.");
}
finally
{
// Zawsze zamykaj plik, nawet jeśli wystąpił wyjątek
if (file != null)
{
file.Close();
}
}
Wyzwanie
ŁatwyUtwórz metodę o nazwie ProcessData, która:
- Przyjmuje parametr typu string reprezentujący nazwę pliku
- Próbuje otworzyć plik i odczytać jego zawartość
- Zapisuje zawartość w konsoli
- Poprawnie zwalnia zasoby, używając bloku finally
- Obsługuje wyjątki FileNotFoundException i IOException
Jeśli nie można znaleźć pliku, wypisz: "ERROR: File not found: [filename]"
Jeśli wystąpi inny błąd IO, wypisz: "ERROR: Could not read the file: [error message]"
Zawsze wypisz "File operation completed." w bloku finally, niezależnie od tego, czy wystąpił wyjątek.
Spróbuj swoich sił
using System;
using System.IO;
class Program
{
public static void ProcessData(string filename)
{
// Wpisz tutaj swój kod
}
static void Main(string[] args)
{
string filename = Console.ReadLine();
ProcessData(filename);
}
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i sterowanie przepływem
1Tablice wielowymiarowe
Podstawy tablic 2DDeklarowanie i inicjalizacja tablic 2DDostęp do elementów tablic 2DZagnieżdżone pętle z tablicami 2DTablice postrzępionePodstawowe operacje na macierzachPodsumowanie — tablice wielowymiarowe4Techniki sterowania przepływem
Wczesne zwrotyKlauzule ochronneInstrukcje skoku (goto)Break i continueSpłaszczanie zagnieżdżonych warunków7Zaawansowane operatory logiczne
Ewaluacja z krótkim spięciemWarunkowe operatory logicznePriorytet operatorówPowtórzenie — zaawansowane operatory2Zaawansowane podejmowanie decyzji
Wiele warunkówZłożona logika Boole’aPorównanie if i switchZagnieżdżone instrukcje switchPodsumowanie — zaawansowane decyzje5Obsługa wyjątków
Podstawy try-catchTypy wyjątkówWiele bloków catchPraca z plikamiBlok finallyusing a try-finallyWłasne wyjątkiPowtórzenie — obsługa błędów3Udoskonalenia pętli
Wydajność pętliIterowanie po złożonych strukturachKażdy typ pętliRefaktoryzacja pętliPodsumowanie — zoptymalizowane pętle6Obsługa wartości null
Podstawy referencji nullTypy wartości dopuszczające nullWzorce sprawdzania nullProgramowanie defensywnePodsumowanie — bezpieczeństwo nullPoćwicz samodzielnie: Kompilator C# online