/ / W jaki sposób kompilacja elma różni się od sprawdzanych wyjątków Java? - Java, Wiąz, Sprawdzane wyjątki

W jaki sposób kompilacja elma różni się od sprawdzanych wyjątków Java? - Java, Wiąz, Sprawdzane wyjątki

elmroszczenia zero-runtime-wyjątki jest jednym z głównych punktów sprzedaży (patrz oficjalna strona internetowa),

Ale jeśli przestaniesz o tym myśleć, nic nie powstrzyma cię przed podzieleniem przez zero lub wyczerpaniem pamięci.

Co elm Kompilator w zasadzie to robi, zmusza do objęcia wszystkich możliwych ścieżek, które mogą prowadzić do wyjątku.

Na przykład:

import String exposing (toInt)
toIntOrZero s = case toInt s of
Err e -> 0
Ok val -> val

Ale jak to się różni od niesławny funkcja "checked-exceptions" w java ?

public static Integer toIntOrZero(String s) {
try { return Integer.valueOf(s); }
catch (NumberFormatException e) { return 0; }
}

Nigdy nie słyszałam żadnych twierdzeń java jest językiem wyjątków zero-runtime.

Odpowiedzi:

5 dla odpowiedzi № 1

Nie bądź zbyt pochłonięty przez hiperbolę marketingową. Oczywiście istnieją klasy błędów, których nigdy nie będzie można całkowicie wykluczyć z dowolnego kompilatora.

Jako takie zawsze je brałemzero-runtime-wyjątki twierdzą z przymrużeniem oka, ale myślę, że rozumiem zamiar proponenta.Wiąz stworzono jako alternatywę dla rozwijania aplikacji front-end w Javascript, który jest bałaganiarskim światem, gdzie wyjątki są obfite i są tylko częścią Wiąz sprawia, że ​​o wiele trudniej jest zastrzelić się w stopę, i bez zbytniego wysiłku, jeśli przejdziesz przez podstawowe testy wytrzymałościowe na swojej aplikacji, prawdopodobnie przyzwyczajenie kiedykolwiek mają wyjątki czasu wykonywania w produkcji.

Wiąz drastycznie zmniejsza możliwość wyjątków na kilka sposobów.

  1. W języku nie ma pojęcia wyjątku możliwego do rzucenia Debug.crash, który, jak sama nazwa wskazuje, powinien być naprawdę używany tylko do debugowania i odgadywania niekompletnych ścieżek logicznych.

Ponieważ nie ma żadnych możliwych wyjątków, problemy z obsługą są najczęściej wykonywane za pomocą takich typów Result i Maybe.

Można to traktować jako luźno analagiczneWyjątki sprawdzane przez Javę, ale koncepcyjnie czują się zupełnie inne niż ja. Spójrzmy prawdzie w oczy. Wyjątki zostały nadużyte. Wspomniasz przykład w Javie, gdzie Integer.valueOf() mówi, że zwróci int, ale jeśli typrzekazać go cokolwiek innego, rozwija stos i bąbelki, aż jakaś funkcja z nadzieją go złapie. Jest to dla mnie bardzo kłopotliwe, a sprawdzone wyjątki mogą pomóc w zmniejszeniu okna propagacji błędów, ale faktem jest, że wyjątek jest niewłaściwym narzędziem do logiki biznesowej.

Alternatywą do rzucania wyjątku byłoby posiadanie klas analagicznych w stosunku do Result i Maybe Wiązów, ale to byłoby prawieniemożliwe do wykonania w początkowych dniach Java, a nawet z Generics, pisanie takich typów jest bardziej nużące i podatne na błędy niż prostota typów Wiązów, a także z powodu zamkniętego systemu Wiązu,

  1. Niepełne dopasowania wzorca powodują awarię kompilacji

W Javie i Javascriptu nie ma możliwościwyczerpujące sprawdzanie dopasowania wzorca, ponieważ system typów na to nie pozwala. Oczywiście, maszynopis wprowadził pewną funkcjonalność, ale trzeba się do tego włączyć. W Elm musisz jawnie obsługiwać wszystkie przypadki. Pewnie, przypuszczam, że możesz twierdzić, że Elm pozwala ci zrezygnować z wyczerpującego dopasowywania wzorców, kończąc wszystkie zestawienia spraw za pomocą catch-all _, ale to byłoby po prostu głupie nadużyciejęzyk. Te kontrole są po to, aby ci pomóc, a ja czuję się o wiele bezpieczniej z tym, że nie mogę się zdecydować na sprawdzanie błędów w Elm - jest tam domyślnie!

  1. Niezmienność

Niezmienność pozwala uniknąć wielu potencjalnych rodzajów błędów, zbyt wiele, aby się tu dostać

  1. Architektura wiązów oferuje czyste oddzielenie między Javascriptem i Wiązem

Elm kompiluje się do Javascript, ale WiązArchitektura oferuje ładną, czystą barierę, aby trzymać wszystkie nieprzyjemne fragmenty Javascriptu od czystego kodu napisanego przez Wiąz. Każdy wyjątek, który może się zdarzyć w Javascript, powinien być obsługiwany przez tę barierę, tak, że błędy we / wy będą zawsze tłumaczone na przyjazny, przyjazny dla Wiązów typ.

Ostatecznie wyjątki środowiska wykonawczego są nadal możliwe (na przykład: następny otagowany Wiąz pytanie poradził sobie ze znanym wyjątkiem spowodowanym przez środowisko wykonawczeprzez rekursywną definicję dekodera Jsona), i wzdragam się za każdym razem, gdy słyszę, jak ktoś mówi, że nie można uzyskać wyjątku w Wiązie. Faktem jest, że wyjątki są możliwe, ale prawie każdy wyjątek, na który natknąłeś się w codziennym rozwoju JavaScript jest głównie niemożliwe w Elmie.


4 dla odpowiedzi nr 2

Jak zauważył komentator, Java odznacza wyjątki, więc błędy runtime zrobić pojawić się. Wiąz ma również niezatwierdzone wyjątki, takie jak dzielenie przez zero, ale pozbywa się tych, które są najczęściej spotykane w praktyce. I jak mówi odpowiedź Chada, Wiąz Maybe/Result typy działają całkiem inaczej w praktyce niż wyjątki sprawdzane przez Javę Doświadczony programista Elma nie napisałby takiej funkcji jak toIntOrZero (a jeśli tak, prawdopodobnie nie używaliby case ... of, wolą zamiast czegoś coś takiego toIntOrZero = String.toInt >> Result.withDefault 0).

Łączenie wielu operacji razem z Result.map, Result.andThen, i tak dalej daje bardzo ekspresyjny sposóbobsługa przypadków błędów bez zmuszania programisty do zbytniego zagłębiania się w chwasty. Na przykład, jeśli chcemy napisać funkcję, która sprawdza poprawność identyfikatora, konwertując go na Int, przeglądając go w pewnej strukturze danych (kiedy może nie być), a następnie weryfikując pewne właściwości powiązane z tym użytkownikiem, możemy napisać coś takiego:

lookupUser : Int -> Result String User
lookupUser intId = ...

userInGoodStanding : User -> Bool
userInGoodStanding user = ...

isValidId : String -> Bool
isValidId id =
String.toInt id
|> Result.andThen lookupUser
|> Result.map userInGoodStanding
|> Result.withDefault False

To brzmi "przekonwertuj identyfikator na int, a następnie spójrzpowiązanego użytkownika, a następnie zweryfikuj użytkownika, a jeśli coś się nie powiedzie, zwróć False. "Twój przebieg może się różnić, ale kiedy już się do tego przyzwyczaisz, ja (i wielu programistów Elm, myślę!) uważam to za naprawdę fajny sposób pisania kodu odpornego na błędy.