Cokolwiek jest w środku, bloki są zawsze wykonywane (prawie) zawsze, więc jaka jest różnica między umieszczeniem w nim kodu a pozostawieniem go niezamkniętego?
c#
exception-handling
Rodrigo
źródło
źródło
Odpowiedzi:
Kod w bloku wreszcie zostanie wykonany niezależnie od tego, czy istnieje wyjątek. Jest to bardzo przydatne, jeśli chodzi o niektóre funkcje porządkowe, które musisz zawsze działać jak zamykanie połączeń.
Zgaduję, że twoje pytanie brzmi: dlaczego powinieneś to zrobić:
Kiedy możesz to zrobić:
Odpowiedź jest taka, że wiele razy kod w instrukcji catch zwróci wyjątek lub wyłączy się z bieżącej funkcji. W tym ostatnim kodzie „alwaysDoThis ();” Wywołanie nie zostanie wykonane, jeśli kod w instrukcji catch wyświetli zwrot lub zgłosi nowy wyjątek.
źródło
Wskazano już na większość zalet używania try-wreszcie, ale pomyślałem, że dodam ten:
Takie zachowanie sprawia, że bardzo przydatne w różnych sytuacjach, szczególnie gdy trzeba wykonać czyszczenia (zasoby wrzucać), choć przy użyciu bloku jest często lepiej w tym przypadku.
źródło
za każdym razem, gdy korzystasz z niezarządzanych żądań kodu, takich jak czytniki strumieniowe, żądania db itp. i chcesz złapać wyjątek, a następnie użyj try catch w końcu i zamknij strumień, czytnik danych itp. w końcu, jeśli nie zrobisz tego, gdy wystąpi błąd, połączenie nie zostanie zamknięte, to naprawdę źle z żądaniami db
jeśli nie chcesz złapać błędu, użyj
a obiekt połączenia zostanie usunięty automatycznie, jeśli wystąpi błąd, ale błąd nie zostanie przechwycony
źródło
Ponieważ w końcu zostanie wykonany, nawet jeśli nie obsłużysz wyjątku w bloku catch.
źródło
Wreszcie instrukcje mogą być wykonywane nawet po powrocie.
źródło
finally
, jak w:to gwarantowana możliwość wykonania kodu po twoim
try..catch
bloku, bez względu na to, czy blok try rzucił wyjątek.To sprawia, że jest idealny do takich rzeczy, jak uwalnianie zasobów, połączenia db, uchwyty plików itp.
źródło
wyjaśnię użycie w końcu z wyjątkiem czytnika plików Przykład
w powyższym przykładzie, jeśli plik o nazwie dane.txt brakuje wyjątek zostanie wyrzucony i będą obsługiwane, ale oświadczenie o nazwie
StreamReader.Close();
nigdy nie zostanie wykonana.Z tego powodu zasoby związane z czytnikiem nigdy nie zostały wydane.
Happy Coding :)
Uwaga: „@” służy do tworzenia ciągów ciągłych , aby uniknąć błędu „Nierozpoznana sekwencja ucieczki”. Symbol @ oznacza dosłowne odczytanie tego ciągu i w przeciwnym razie nie należy interpretować znaków kontrolnych.
źródło
Załóżmy, że musisz ustawić kursor z powrotem na domyślny wskaźnik zamiast kursora oczekującego (klepsydra). Jeśli wyjątek zostanie zgłoszony przed ustawieniem kursora i nie spowoduje całkowitego zawieszenia aplikacji, możesz pozostać z mylącym kursorem.
źródło
Czasami nie chcesz obsłużyć wyjątku (brak bloku catch), ale chcesz wykonać kod czyszczenia.
Na przykład:
źródło
Wreszcie blok jest cenny do czyszczenia wszelkich zasobów przydzielonych w bloku try, a także do uruchamiania dowolnego kodu, który musi zostać wykonany, nawet jeśli istnieje wyjątek. Kontrola jest zawsze przekazywana do bloku ostatecznie, niezależnie od tego, jak wychodzi blok try.
źródło
Ahh ... Myślę, że rozumiem, co mówisz! Zajęło mi to chwilę ... zastanawiasz się "dlaczego umieścić go w bloku na końcu zamiast po bloku w końcu i całkowicie poza try-catch-w końcu".
Na przykład może to być spowodowane tym, że wstrzymujesz wykonywanie, jeśli zgłosisz błąd, ale nadal chcesz wyczyścić zasoby, takie jak otwarte pliki, połączenia z bazą danych itp.
źródło
Kontrolny przepływ ostatniego bloku następuje po bloku Try lub Catch.
z wyjątkiem 1> 2> 3> 4> 5, jeśli 3 ma instrukcję Return 1> 2> 3> 4
bez wyjątku 1> 2> 4> 5, jeśli 2 ma instrukcję return 1> 2> 4
źródło
Jak wspomniano w dokumentacji :
Warto również przeczytać to , co stanowi:
Jest więc jasne, że kod znajdujący się w
finally
klauzuli zostanie wykonany, nawet jeśli poprzedniacatch
klauzula zawierałareturn
instrukcję.źródło