Istnieje wiele wymagań, aby system mógł poprawnie przekazywać i obsługiwać wyjątki. Istnieje również wiele opcji wyboru języka do wdrożenia tej koncepcji.
Wymagania dotyczące wyjątków (w określonej kolejności):
Dokumentacja : język powinien umożliwiać dokumentowanie wyjątków, które API może zgłaszać. Idealnie, ten nośnik dokumentacji powinien nadawać się do użytku maszynowego, aby umożliwić kompilatorom i IDE wsparcie programistom.
Przekazywanie wyjątkowych sytuacji : ta jest oczywista, aby umożliwić funkcji przekazywanie sytuacji, które uniemożliwiają wywołanej funkcji wykonanie oczekiwanej akcji. Moim zdaniem istnieją trzy duże kategorie takich sytuacji:
2.1 Błędy w kodzie, które powodują, że niektóre dane są nieprawidłowe.
2.2 Problemy z konfiguracją lub innymi zasobami zewnętrznymi.
2.3 Zasoby, które są z natury zawodne (sieć, systemy plików, bazy danych, użytkownicy końcowi itp.). Są to trochę zasadne przypadki, ponieważ ich niewiarygodna natura powinna sprawić, że spodziewamy się ich sporadycznych niepowodzeń. Czy w takim przypadku sytuacje te należy uznać za wyjątkowe?
Podaj wystarczającą ilość informacji, aby kod mógł go obsłużyć : wyjątki powinny zapewniać odbiorcy wystarczające informacje, aby mógł zareagować i ewentualnie poradzić sobie z sytuacją. informacje powinny również być wystarczające, aby po zalogowaniu wyjątki zapewniały programiście wystarczający kontekst do zidentyfikowania i wyodrębnienia złych stwierdzeń i zapewnienia rozwiązania.
Zapewnij programistom pewność co do aktualnego stanu stanu wykonania jego kodu : Możliwości obsługi wyjątków w systemie oprogramowania powinny być na tyle obecne, aby zapewnić niezbędne zabezpieczenia, jednocześnie nie wchodząc w drogę programistom, aby mógł skupić się na zadaniu dłoń.
Aby uwzględnić te, w różnych językach wdrożono następujące metody:
Sprawdzone wyjątki Zapewniają świetny sposób na dokumentowanie wyjątków, a teoretycznie, jeśli są poprawnie wdrożone, powinny zapewnić wystarczającą pewność, że wszystko jest w porządku. Jednak koszt jest taki, że wielu uważa, że bardziej produktywne jest po prostu ominięcie albo przez połknięcie wyjątków, albo ponowne ich odrzucenie jako niesprawdzone wyjątki. W przypadku niewłaściwie sprawdzonego wyjątku traci on całą swoją użyteczność. Sprawdzone wyjątki utrudniają utworzenie stabilnego w czasie interfejsu API. Implementacje ogólnego systemu w ramach konkretnej domeny przyniosą mnóstwo wyjątkowej sytuacji, która byłaby trudna do utrzymania przy użyciu wyłącznie sprawdzonych wyjątków.
Niesprawdzone wyjątki - znacznie bardziej wszechstronne niż sprawdzone wyjątki, nie udokumentują prawidłowo możliwych wyjątkowych sytuacji w danej implementacji. Opierają się na dokumentacji ad hoc, jeśli w ogóle. Stwarza to sytuacje, w których zawodna natura medium jest maskowana przez interfejs API, który daje wrażenie niezawodności. Również po rzuceniu wyjątki te tracą znaczenie, gdy wracają w górę przez warstwy abstrakcji. Ponieważ są słabo udokumentowane, programista nie może specjalnie zaatakować ich i często musi rzucić znacznie szerszą sieć niż jest to konieczne, aby zapewnić, że systemy wtórne, w przypadku awarii, nie spowodują awarii całego systemu. Co prowadzi nas z powrotem do problemu z połykaniem, sprawdzone wyjątki.
Typy zwrotów wielostanowiskowych W tym przypadku należy polegać na rozłącznym zestawie, krotce lub innej podobnej koncepcji, aby zwrócić oczekiwany wynik lub obiekt reprezentujący wyjątek. Tutaj nie ma rozwijania stosu, bez przecinania kodu, wszystko działa normalnie, ale wartość zwracana musi być sprawdzona pod kątem błędu przed kontynuowaniem. Tak naprawdę nie pracowałem z tym jeszcze, więc nie mogę komentować z doświadczenia. Przyznaję, że rozwiązuje to pewne wyjątki od omijania normalnego przepływu, ale nadal będzie cierpiał z powodu tych samych problemów, co sprawdzone wyjątki, jako męczących i stale „na twarz”.
Pytanie brzmi:
Jakie masz doświadczenie w tej sprawie i co według ciebie jest najlepszym kandydatem do stworzenia dobrego systemu obsługi wyjątków dla danego języka?
EDYCJA: Kilka minut po napisaniu tego pytania natknąłem się na ten post , straszne!
noexcept
historię w C ++ może dać bardzo dobry wgląd w EH w C # i Javie.)