Jest to powiązane pytanie: Czy użycie klauzuli w końcu do wykonywania pracy po powrocie jest złe / niebezpieczne?
W przywoływanym Q ostatecznie kod jest związany z zastosowaną strukturą i koniecznością pobierania z wyprzedzeniem. Moje pytanie jest trochę inne i uważam, że jest to istotne dla szerszej publiczności. Moim szczególnym przykładem jest aplikacja C # winform, ale w końcu dotyczyłaby również użycia C ++ / Java.
Zauważam sporo bloków typu try-catch-wreszcie, w których jest dużo kodu niezwiązanego z wyjątkami i obsługą / czyszczeniem wyjątków ukrytych w bloku. Przyznaję, że mam tendencję do posiadania bardzo ścisłych bloków try-catch-wreszcie z kodem ściśle związanym z wyjątkiem i obsługą. Oto kilka przykładów tego, co widzę.
W blokach try będzie wiele wstępnych wywołań i zmiennych, które prowadzą do kodu, który może zostać wygenerowany. Informacje o logowaniu zostaną skonfigurowane i uruchomione również w bloku try.
Na koniec bloki będą miały wywołania formatowania form / module / control (mimo że aplikacja ma się zakończyć, jak wyrażono w bloku catch), a także tworzyć nowe obiekty, takie jak panele.
W przybliżeniu:
methodName (...) { próbować { // Dużo kodu dla metody ... // kod, który mógłby wyrzucić ... // Dużo więcej kodu dla metody i zwrot ... } złapać (coś) {// obsłuż wyjątek} Wreszcie { // niektóre porządki z powodu wyjątku, zamykanie rzeczy // więcej kodu dla rzeczy, które zostały utworzone (ignorując fakt, że mogły zostać zgłoszone wyjątki) ... // może stworzyć więcej obiektów } }
Kod działa, więc ma pewną wartość. Nie jest dobrze zamknięty, a logika jest nieco skomplikowana. Jestem (boleśnie) zaznajomiony z ryzykiem związanym z przesuwaniem kodu i refaktoryzacją, więc moje pytanie sprowadza się do chęci poznania doświadczeń innych osób z podobnie skonstruowanym kodem.
Czy zły styl uzasadnia dokonywanie zmian? Czy ktoś został poważnie poparzony w podobnej sytuacji? Czy chciałbyś podzielić się szczegółami tego złego doświadczenia? Zostaw to, bo jestem przesadnie reagujący i nie jest to taki zły styl? Zyskujesz korzyści związane z utrzymaniem porządku?
finally
robi w C #). Co to jest odpowiednik C ++? Myślę o kodzie po catch
, i to samo dotyczy kodu po C # finally
.
Environment.FailFast()
; może nie zostać wykonany, jeśli masz nieprzechwycony wyjątek. I staje się jeszcze bardziej skomplikowane, jeśli masz blok iteratora, z finally
którym iterujesz ręcznie.
finally
. Wszystkie dobre zastosowania są objęte RAII / RRID / SBRM (dowolny akronim, jaki chcesz).