Moim zdaniem wyjątki są niezbędnym narzędziem do wykrywania błędów kodu w czasie wykonywania. Zarówno w testach, jak i podczas produkcji. Spraw, aby ich wiadomości były wystarczająco szczegółowe, aby w połączeniu ze śledzeniem stosu można było dowiedzieć się, co się stało z dziennika.
Wyjątki stanowią głównie narzędzie programistyczne i sposób uzyskiwania rozsądnych raportów o błędach z produkcji w nieoczekiwanych przypadkach.
Oprócz oddzielenia problemów (szczęśliwa ścieżka z oczekiwanymi błędami w porównaniu do wpadnięcia do jakiegoś ogólnego programu obsługi nieoczekiwanych błędów) jest dobra rzecz, dzięki czemu twój kod jest bardziej czytelny i łatwy w utrzymaniu, w rzeczywistości niemożliwe jest przygotowanie kodu na wszystkie możliwe nieoczekiwane przypadki, nawet nadmuchując go kodem obsługi błędów, aby zakończyć nieczytelność.
To właściwie oznacza „nieoczekiwany”.
Btw., Czego się spodziewać, a czego nie, to decyzja, którą można podjąć tylko na stronie połączenia. Dlatego sprawdzone wyjątki w Javie nie zadziałały - decyzja jest podejmowana w momencie tworzenia API, kiedy nie jest jasne, czego się spodziewać lub nieoczekiwanego.
Prosty przykład: interfejs API mapy skrótów może mieć dwie metody:
Value get(Key)
i
Option<Value> getOption(key)
pierwszy zgłasza wyjątek, jeśli go nie znaleziono, ten drugi daje wartość opcjonalną. W niektórych przypadkach ten drugi ma większy sens, ale w innych kod musi po prostu oczekiwać wartości dla danego klucza, więc jeśli go nie ma, jest to błąd, którego ten kod nie może naprawić, ponieważ podstawowy założenie się nie powiodło. W tym przypadku pożądane jest wypadnięcie ze ścieżki kodu i przejście do jakiejś ogólnej procedury obsługi w przypadku niepowodzenia wywołania.
Kod nigdy nie powinien próbować radzić sobie z nieudanymi podstawowymi założeniami.
Oczywiście z wyjątkiem sprawdzania ich i rzucania dobrze czytelnych wyjątków.
Rzucanie wyjątków nie jest złem, ale ich złapanie może być. Nie próbuj naprawiać nieoczekiwanych błędów. Złap wyjątki w kilku miejscach, w których chcesz kontynuować pętlę lub operację, zaloguj je, być może zgłoś nieznany błąd i to wszystko.
Bloki połowowe w tym miejscu to bardzo zły pomysł.
Zaprojektuj swoje interfejsy API w taki sposób, aby ułatwić wyrażenie swojej woli, tj. Oświadczenie, czy oczekujesz określonego przypadku, na przykład brak klucza, czy nie. Użytkownicy Twojego interfejsu API mogą wtedy wybrać wywołanie wyrzucające tylko w naprawdę nieoczekiwanych przypadkach.
Sądzę, że powodem, dla którego ludzie nie lubią wyjątków i idą za daleko, pomijając to kluczowe narzędzie do automatyzacji obsługi błędów i lepszego oddzielania problemów od nowych języków, są złe doświadczenia.
To i pewne nieporozumienia na temat tego, do czego są naprawdę dobre.
Symulacja ich poprzez wykonanie WSZYSTKIEGO poprzez monadowe wiązanie sprawia, że kod jest mniej czytelny i łatwy do utrzymania, a ty kończysz się bez śladu stosu, co pogarsza to podejście.
Obsługa błędów funkcjonalnych jest świetna w przypadku oczekiwanych błędów.
Niech obsługa wyjątków automatycznie zajmie się całą resztą, właśnie po to :)
panic
to, co nie jest takie samo. Oprócz tego, co tam powiedziano, wyjątek nie jest niczym więcej niż wyrafinowanym (ale wygodnym) sposobem na wykonanieGOTO
, choć z oczywistych powodów, nikt tak go nie nazywa.