Sens instrukcji "finally" za blokami "try catch"

0

Mam pytanie o sens instrukcji finally jako instrukcji którą można dawać za try catch.
Otóż instrukcja finally wykona się zawsze, niezależnie od tego czy blok try zwróci wyjątek czy też nie.
Zatem jaki sens ma stosowanie finally, dlaczego tego co zawiera blok finally nie mogę napisać po prostu pod catchem ?
Przecież to co byłoby pod catchem również zawsze by się wykonało....

0
Adamos19 napisał(a):

Przecież to co byłoby pod catchem również zawsze by się wykonało....
Nie, bo może być jakiś wyjątek nie ujęty w catch

Pokaż_Formatkę();
try
  {
   Coś_robisz_na_formatce();
  }
finally
  {
   Schowaj_Formatkę();
  }
0

Mam rozumieć że jeśli wystąpi wyjątek nie ujęty w procedurze catch, wówczas blok finally się nie wykona ?

0

Wręcz przeciwnie. Finally wykona sie tak czy siak. Ale kod który byłby ZA blokiem finally już się nie wykona bo wyjątek poleci wyżej.
W efekcie jak w try otwarłeś plik i zamykanie dałeś ZA blokiem a nie w finally to w przypadku wyjątku (nie złapanego) plik nie zostanie zamknięty.

1

W bloku finally przeważnie się zwalnia zasoby. Niezależnie od poprawności wykonania zasoby powinno się zwolnić (połączenie z bazą danych czy coś).

0

Ahaaa, dobra, kumam teraz.
Dzięki.
Pozdrawiam!

PS. Możesz mi jeszcze czy to nie jest przypadkiem tak że niewyłapane wyjątki zatrzymają działanie aplikacji ?

0

Nie tyle zatrzymują, co kończą.

0
Shalom napisał(a):

Ale kod który byłby ZA blokiem finally już się nie wykona bo wyjątek poleci wyżej.

Nie wiem, co miałeś na myśli. Przykład kodu z blokiem finally:

            try
            {
                Console.WriteLine("Przed blabla"); // wykona się
                System.IO.File.ReadAllText("blabla");  // nie ma takiego pliku
                Console.WriteLine("Po blabla"); // NIE WYKONA SIĘ
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception"); // wykona się GDY WYSTĄPI WYJĄTEK
            }
            finally
            {
                Console.WriteLine("Tu finally"); // wykona się ZAWSZE
            }

            Console.WriteLine("To za blokiem finally"); // wykona się ZAWSZE 

Albo mi zmęczenie już daje znać o sobie i nie rozumiem co piszesz, albo sam nie wiem... palnąłem bzdurę jakąś czy jak?

2

No jak łapiesz Exception to jasne. Ale złap jakiś konkretny wyjątek a rzuć innym... Jak stosujesz pokemon exception handling (gotta catch 'em all) to nigdy ci się program nie "wysypie" ;]

0
Shalom napisał(a):

No jak łapiesz Exception to jasne. Ale złap jakiś konkretny wyjątek a rzuć innym...

A, ok, tego nie wychwyciłem z dyskusji. Czas więc jednak na weekend :D

Shalom napisał(a):

Jak stosujesz pokemon exception handling (gotta catch 'em all) to nigdy ci się program nie "wysypie" ;]

A tego nie było, jak pisałem posta. Nie stosuję tego tak, to był przykład, że jednak się coś za tym finally wykona... :P

0

@_13th_Dragon

Mówimy o C# ...

A co w C# nie zwalnia się zasobów? A zasoby niezarządzane?

1 użytkowników online, w tym zalogowanych: 0, gości: 1