Istnieje przepis dotyczący blokowania try-catch w javascript . Podczas gdy w java lub innym języku obowiązkowa jest obsługa błędów, nie widzę, aby ktokolwiek używał ich w javascript w większym stopniu. Czy to nie jest dobra praktyka, czy po prostu nie potrzebujemy ich w javascript?
69
While in java or *any other language* it is mandatory to have error handling...
- Nie całkiem. Java, tak, ale istnieje wiele języków, które nie nalegają na try-catch (jak C #).Odpowiedzi:
Należy unikać
throw
błędów jako sposobu przekazywania warunków błędów w aplikacjach.throw
Oświadczenie powinno być stosowane jedynie „Do tego nigdy nie powinno się zdarzyć, crash i spalić. Nie elegancko odzyskać w jakikolwiek sposób”try catch
jest jednak stosowany w sytuacji, gdy obiekty hosta lub skrypt ECMAScript mogą zgłaszać błędy.Przykład:
Zalecenia w społeczności node.js to przekazywanie błędów w wywołaniach zwrotnych (ponieważ błędy występują tylko w przypadku operacji asynchronicznych) jako pierwszy argument
Istnieją również inne problemy, takie jak try / catch jest naprawdę drogi i brzydki, a po prostu nie działa z operacjami asynchronicznymi.
Ponieważ operacje synchroniczne nie powinny generować błędów i nie działają z operacjami asynchronicznymi, nikt nie używa try catch, z wyjątkiem błędów zgłaszanych przez obiekty hosta lub skrypt ECMAScript
źródło
Error
, ale jest ich niewiele.document.getElementById
nie rzuca, gdy element nie istnieje, po prostu zwracanull
. To samo można zrobić dla prawie wszystkich przypadkówTry / catch w Javascript nie jest tak kuloodporny jak w innych językach z powodu asynchronicznej natury Javascript. Rozważ ten fragment:
Problem polega na tym, że przepływ sterowania opuszcza
try
blok przeddo_something_that_throws()
wykonaniem, więc błąd zgłoszony w wywołaniu zwrotnym nigdy nie zostaje wyłapany.Dlatego w wielu przypadkach try / catch jest w zasadzie nieodpowiednie i nie zawsze jest oczywiste, czy coś wykonuje kod asynchronicznie, czy nie. Na szczęście javascript ze swoistym idiomem jednowątkowym asynchronicznym zwrotnym i obsługa faktycznych zamknięć stanowi elegancką alternatywę: obsługę błędów w stylu kontynuacji przejścia. Wystarczy przekazać właściwą odpowiedź na każdy błąd jako funkcję, np .:
źródło
Wiele z tych odpowiedzi jest nieco starych i nie uwzględnia nowych funkcji ES7
async
iawait
.Używając
async
/await
możesz teraz uzyskać asynchroniczny przepływ sterowania, jak chcesz:Dowiedz się więcej o
async
/await
tutaj . Możesz użyćasync
/await
teraz używając babel .źródło
try-catch w javascript jest tak samo ważny i użyteczny jak w każdym innym języku, który je implementuje. Jest jeden główny powód, dla którego nie jest tak często używany w javascript, jak w innych językach. Z tego samego powodu javascript jest postrzegany jako brzydki język skryptowy, z tego samego powodu, dla którego ludzie myślą, że programiści javascript nie są prawdziwymi programistami:
Sam fakt, że tak wiele osób jest narażonych na javascript (z powodu jedynego obsługiwanego języka przez przeglądarki) oznacza, że masz dużo nieprofesjonalnego kodu. Oczywiście istnieje również wiele drobnych powodów:
catch
stanie (rzeczy asynchroniczne)Niezależnie od tego, try-catch powinny być stosowane, ale oczywiście trzeba nauczyć się je właściwie wykorzystać - jak wszystko w programowaniu.
źródło
Uważam, że wiele powodów, które
try..catch
są rzadkie w JavaScript, to fakt, że język ma dość wysoką tolerancję na błędy. Zdecydowaną większość sytuacji można rozwiązać za pomocą kontroli kodu, dobrych wartości domyślnych i zdarzeń asynchronicznych. W niektórych przypadkach po prostu użycie wzorca zapobiegnie problemom:Niektóre z głównych problemów w innych językach, które powodują wyjątki, po prostu nie istnieją w JS. Rzutowanie typu nie jest potrzebne przez większość czasu. Zamiast tego preferowaną metodą jest zazwyczaj sprawdzenie funkcji (wymuszenie określonego interfejsu):
Wraz z dodaniem
async
/await
do językatry..catch
staje się coraz bardziej powszechne. Obiecuje, że jest formą asynchronicznątry..catch
, dlatego warto oczekiwać, że:zamiast tego należy zapisać jako:
źródło
Być może kolejnym powodem, dla którego try / catch nie jest zbyt często używany w Javascript, jest to, że konstrukcja nie była dostępna w pierwszych wersjach Javascript ... została dodana później.
W rezultacie niektóre starsze przeglądarki nie obsługują tego. (W rzeczywistości może powodować błąd analizatora składni / składni w niektórych starszych przeglądarkach, co jest trudniejsze do „zaprogramowania w obronie” przed większością innych rodzajów błędów).
Co ważniejsze, ponieważ początkowo nie był dostępny, wbudowane funkcje JavaScript, które zostały początkowo wydane (co w wielu językach można by nazwać funkcjami „bibliotecznymi”), nie korzystają z niego. (Nie działa zbyt dobrze, aby „złapać” błąd z someobject.somefunction (), jeśli nie „wyrzuca”, ale zamiast tego zwraca po prostu „null”, gdy napotka problem.)
Jeszcze innym możliwym powodem jest to, że mechanizm try / catch początkowo nie wydawał się potrzebny (i nadal nie wydaje się tak przydatny). Jest to naprawdę potrzebne tylko wtedy, gdy połączenia są rutynowo zagnieżdżane na kilku poziomach; samo zwrócenie jakiegoś ERRNO działałoby dobrze w przypadku połączeń bezpośrednich (chociaż aby było naprawdę przydatne, gdy tylko jest dostępne, najlepszą praktyką w większości języków jest używanie go wszędzie, a nie tylko w przypadku głęboko zagnieżdżonych połączeń). Ponieważ początkowo oczekiwano, że logika Javascript będzie niewielka i prosta (w końcu jest to tylko dodatek do strony internetowej :-), wywołania funkcji nie były głęboko zagnieżdżone, więc mechanizm try / catch nie wydawał się konieczny.
źródło
Uważam, że nie są tak często używane, ponieważ zgłaszanie wyjątków w kodzie klienta JavaScript utrudnia debugowanie strony.
Zamiast rzucać wyjątki, generalnie wolę pokazywać wszystkie alerty, (tj.
alert("Error, invalid...");
)Może to zabrzmieć dziwnie, ale po stronie klienta występują błędy JavaScript, jeśli klient korzysta ze strony, którą zbudowałeś, a strona zgłasza wyjątek, chyba że klient jest specjalistą od kodowania, nie ma mowy, by kiedykolwiek mógł powiedzieć o co ci chodzi.
Zadzwoni tylko do Ciebie, mówiąc: „Hej, strona X nie działa!”, A następnie od Ciebie zależy, czy uda Ci się znaleźć to, co poszło nie tak i gdzie w kodzie.
Używając zamiast tego pola alertu, bardziej prawdopodobne jest, że zadzwoni i powie coś w stylu: „Hej, kiedy kliknę przycisk A strony X, wyświetli się pole z napisem ...” , zaufaj mi, łatwiej będzie znaleźć błąd.
źródło