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?
finallyrobi 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 finallyktórym iterujesz ręcznie.
finally. Wszystkie dobre zastosowania są objęte RAII / RRID / SBRM (dowolny akronim, jaki chcesz).