Jason. Cała informatyka w jednym miejscu!

Finalny materiał o obsługiwaniu wyjątków w języku C# będzie ukoronowaniem zdobytej wcześniej wiedzy, dlatego też jak łatwo się domyślić, niezbędne jest przeczytanie całej poprzedniej "trylogii". Na dzisiaj przygotowałem materiał o tym, na czym polega warunkowe przechwytywanie wyjątków w języku C#! To wyjątki mogą być przechwytywane pod pewnymi warunkami :O? Wygląda na to, że tak. Przygotujcie sobie zawczasu C# w wersji 6.0 lub wyższej, bo to zostało wprowadzone dopiero wtedy!

WARUNKOWE PRZECHWYTYWANIE WYJĄTKÓW W JĘZYKU C# RÓŻNI SIĘ TYLKO JEDNYM SZCZEGÓŁEM

Przyjrzeliśmy się wielu technikom i sposobom radzenia sobie z wyjątkami. Poznaliście słowa "try", "catch" i "finally", kiedy opłaca się zgłaszać się wyjątki samemu w sposób jawny oraz jak samemu zdefiniować nowy typ wyjątku wraz z dodawaniem niestandardowego komunikatu, aby można go było później przechwycić. Jak widzieliście, istnieje kilka dróg zwalczania sytuacji niepożądanych, które doprowadzają do nieprzyjemnych skutków mogących kończyć się nie tylko na rozwścieczeniu użytkownika. Pokażę Wam teraz blok "catch" z nałożonym warunkiem "when"! Pytania będą później :). Patrzcie uważnie:

int x = 10;

try
{
	throw new MyException("Mój wyjątek.");
}
catch (MyException me) when (x > 0)
{
	Console.WriteLine(me.Message);
	Console.WriteLine(me.ToString());
}

Wszystko to samo, nie? PRAWIE :O. Jeden mały szczegół wystaje zaraz po nawiasach obok słowa "catch". Mamy słówko "when", a po nim wstawione W OBOWIĄZKOWE nawiasy wyrażenie warunkowe, które ma zwrócić wartość boolowską. Teraz program ma nie tylko na bieżąco monitorować potrzebę przechwycenia sygnału, ale także weryfikować dodatkowy warunek, który musi zostać spełniony, aby doszło do wykonania naszych instrukcji!

W rzeczywistości, od teraz muszą zostać spełnione DWA warunki, aby warunkowe przechwytywanie wyjątków w języku C# zostało zrealizowane:

  • zgłoszony wyjątek musi być typu "MyException" bądź jednym z jego pochodnych,
  • wartość zmiennej "x" musi być większa od zera.

Kiedy już dojdzie do "wyłapania" sygnału i potwierdzenia, że to jest odpowiedni typ, ścieżki przebiegu są dwie. Albo dojdzie do wykonania bloku "catch", albo program zostawi to tak jak jest, wyjątek będzie nieobsłużony, a program czeka "wykopanie" z listy procesów. Wtedy wszystko zależy od zmiennej "x". W przedstawionym powyżej przykładzie znajduje się wartość 10. To znaczy, że oba warunki będą prawdziwe i blok "catch" się wykona. Natomiast kiedy przypiszecie wartość mniejszą bądź równą zero, klauzula "catch" zostanie zignorowana i wszystko pójdzie tak, jakby tej całej konstrukcji w ogóle nie było :O.

Przydatność do użycia? Sytuacja, kiedy chcemy potraktować pewne sytuacje lub anomalie np. w algorytmice jako czynnik "godny" potraktowania jak zagrożenie, bez konieczności definiowania całego nowego typu wyjątku. Moglibyśmy wtedy to przypisać do klasycznego "Exception" i sprawa załatwiona. Warunkowe przechwytywanie wyjątków w języku C# w taki sposób może ułatwić życie. Możecie definiować wiele bloków "catch" dla tego samego typu wyjątku w celu określenia różnych warunków po "when":

try
{
	throw new MyException("Mój wyjątek.");
}
catch (MyException me) when (x > 0)
{
	Console.WriteLine("Przechwycono wyjątek, bo \"x\" jest większe od 0.");
}
catch (MyException me) when (x == 0)
{
	Console.WriteLine("Przechwycono wyjątek, bo \"x\" jest równe 0.");
}

chociaż wydaje mi się, że wtedy to już jest lepiej wyłapać dany typ jeden raz, a warunki umieścić już w środku i tam podejmować decyzje.

Warunkowe przechwytywanie wyjątku w języku C#

Warunkowe przechwytywanie wyjątków w języku C# polega na "wyłapaniu" wskazanego typu wyjątku w połączeniu z instrukcją warunkową. Wyjątek zostanie przechwycony tylko, gdy wynik koniunkcji będzie pozytywny.


Zamykam temat obsługi wyjątków w "CSharpie" :D. Cieszę się, że mogłem podzielić się z Wami tą wiedzą, mimo przygnębiającego faktu, że wiele osób napisało o tym samym kilka do kilkunastu lat temu :P.

PODOBNE ARTYKUŁY