Witam
Zakładam, że wyjątek jest obsłużony w odpowiedniej klauzuli catch (taki try - catch - finally w pętli while). Czy następuje wtedy kolejne przejście pętli od początku?
Pozdrawiam
Witam
Zakładam, że wyjątek jest obsłużony w odpowiedniej klauzuli catch (taki try - catch - finally w pętli while). Czy następuje wtedy kolejne przejście pętli od początku?
Pozdrawiam
Czemu miałoby nie nastąpić? Faktycznie wszystko jest wewnątrz pętli to naturalnie wykona się reszta kodu tej iteracji (to co było za całym blokiem później w pętli) i przejdzie do normalnego wykonywania reszty pętli. Wszystko zawsze musi działać zgodnie z logiką, inaczej nie byłoby to programowanie.
Pętla while jest przerywana gdy:
Jak wiadomo rzucenie wyjątku jest jak goto do miejsca w którym ten wyjątek zostanie obsłużony - po obsłużeniu sterowanie przechodzi tuż za blok catch/finally.
Chwila. Robi się pętla while. W niej jest blok try. W nim może pojawić się wyjątek. Pojawia się. Jako, że obsługuję go w bloku catch, wykonają się wszystkie instrukcje w try do momentu w którym pojawił się wyjątek. Następnie wykonywanie bloku try jest przerywane i wykonują się wszystkie instrukcje z bloku catch w którym przechwytuje i obsługuję ten wyjątek. Następnie wykonuje się cały blok finally jeśli taki jest. Załóżmy, że po bloku finally jest koniec pętli while. I teraz pytanie czy wykonywania wraca do pierwszej instrukcji w pętli while - czyli wykonywana jest następna iteracja, czy też jest coś innego robione?
Naturalnie przejdzie do następnej iteracji, przecież żaden z warunków podanych przez Wibowita nadal nie został spełniony. Wyjątek nie zwiał ze środka pętli - został złapany w czasie iteracji.
Osobiście używam podobnej konstrukcji do obsługi interaktywnej idiotoodporności:
do try
{
//... potencjalnie durne działanie usera (pierwsze lub kolejne)
}
catch(/*...*/)
{
//... wypięcie się na usera
}
while(/*...*/); //sprawdzenie czy user skończył z durnotami ;)
Co akurat ładnie mi się pokrywa z moim podwójnym stylistycznym zboczeniem do redukcji nadmiarowych nawiasów gdy w pętli jest tylko jedna instrukcja (tutaj try).