Jako programista Java zawsze byłem krytyczny wobec niesprawdzonych wyjątków. Głównie programiści używają go jako drogi do łatwości kodowania, aby później stworzyć problemy. Również programy (choć nieporządne) z zaznaczonymi wyjątkami są znacznie solidniejsze w porównaniu do niesprawdzonych odpowiedników.
Co zaskakujące, w Scali nie ma nic zwanego sprawdzonymi wyjątkami. Wszystkie Java zaznaczone i niezaznaczone są odznaczone w Scali.
Jaka jest motywacja tej decyzji? Dla mnie otwiera szeroki zakres problemów przy korzystaniu z dowolnego kodu zewnętrznego. A jeśli przypadkiem dokumentacja jest słaba, powoduje to ZABIJ.
Odpowiedzi:
Sprawdzone wyjątki są w większości uważane za niepowodzenia. Zauważ, że nie zostały utworzone żadne języki po ich przyjęciu przez Javę. Zobacz http://www.artima.com/intv/handcuffs2.html , http://googletesting.blogspot.ru/2009/09/checked-exceptions-i-love-you-but-you.html , http: / /www.mindview.net/Etc/Discussions/CheckedExceptions itp.
W szczególności są nierozkładalne (z wyjątkiem powrotu do
throws Exception
).W Scali masz lepszą opcję: używanie typów algebraicznych do zwracania wartości, takich jak
Option[T]
,Either[Exception, T]
własny typ, gdy chcesz, aby użytkownik obsługiwał określone przypadki (np. Zamiastty masz
a teraz konsument musi obsługiwać wszystkie wyniki)
Do radzenia sobie z zewnętrznym kodem, który generuje wyjątki, masz
scala.util.control.exception
lubscala.util.Try
(począwszy od Scali 2.10).źródło
try..catch
wydaje się o wiele bardziej czytelny niżif
. Co więcej, mogę również zagwarantować, że ci sami programiści nie będą pisać kodu, który zwraca wynik błędu - zbyt skomplikowany w Scali - nie możesz nawet powrócić z funkcji, kiedy chcesz (tak jak w Pascal)Sprawdzone wyjątki w Javie nie są takie złe. Oczywiście ADT może być lepszą opcją dla Scali, ale w Javie sprawdzone wyjątki mają swoje miejsce, a argument uporządkowanego kodu jest po prostu bezsensowny, bez znaczenia, bez względu na to, ile blogów go powtórzyło. Mówi w zasadzie, że z radością powinieneś ignorować trudne i możliwe do naprawy warunki, które mogą się zdarzyć w twoim systemie, ponieważ system typu śrubowego, ładny kod sprawia, że twój system jest automagicznie wydajny. Takie rozumowanie również wyjaśnia, dlaczego tak wielu programistów Java dobrowolnie przenieść swój kod do plików XML (wiosna, Maven, itp tęsknię całkiem częścią).
Przyczyna braku sprawdzonych wyjątków w Scali podana przez M. Odersky poniżej http://www.scala-lang.org/old/node/8787.html jest zaskakująco inna i ma sens.
Nie jestem pewien, ale myślę, że lambda Java 8 są również ograniczone do niesprawdzonych wyjątków.Metody w większości (wszystkich?) Nowych interfejsów funkcjonalnych w JDK 8 (java.util.function.*
) również nie deklarują niezaznaczonych wyjątków.źródło
Jeśli chcesz zyskać na wydajności, musisz zrezygnować ... precyzja / kontrola <- Potrzebuję na to lepszego słowa.
Scala znajduje się na szczycie, jeśli chodzi o abstrakcję. Jeśli jednym z celów Scali jest pozbycie się irytującego kodu, to oczywistym miejscem do obejrzenia jest obsługa wyjątków Javy. Jeśli chcesz napisać szybki kod w Javie, po prostu rzucaj sprawdzonymi wyjątkami, aż zostaną trafione
main()
i nie zostaną zaznaczone.Nie wiem, czy rozumiem dokładnie to, o co pytasz, ale jest to moim zdaniem najbardziej oczywisty powód.
Cóż, trochę się rozejrzałem i ktoś napisał o tragedii wyjątków czekowych .
źródło