W tym tutorialu, zostaniesz wprowadzony do błędów w JavaScript, koncepcji try-catch i jak jest ona używana oraz małe wprowadzenie do obsługi wewnętrznych błędów z Angular errorHandler.
Błędy
Jedna z moich ulubionych gwiazd filmowych, Samuel L. Jackson, był pierwszą osobą, od której usłyszałem zdanie „błądzić jest rzeczą ludzką”, i chociaż nie pamiętam tytułu tego filmu, teraz możesz zgodzić się ze mną, że to samo dzieje się z błędami podczas pisania kodu. Jako deweloper Angular, wiesz już, że błędy mogą być spowodowane przez osobiste błędy, takie jak posiadanie deklaracji importu z nazwą rozszerzenia pliku w Angular 7 i pokazuje się w przeglądarce, jeśli nie uda ci się go złapać.
import { DataService } from 'src/app/services/data.service.ts';
Błędy mogą wynikać z braku testów, komunikacji z serwerem, a nawet niejednoznaczności projektu Angular, nad którym pracujesz. Jesteśmy ludźmi i dlatego jesteśmy podatni na błędy, to jest jeden z powodów, dla których dobry edytor, taki jak VS Code, zawsze narysuje piskliwe linie, gdy zaczniesz się wykolejać.
Wymagania wstępne
Aby móc podążać za demonstracją w tym artykule powinieneś mieć:
- Node w wersji 11.0 zainstalowany na swoim komputerze.
- Node Package Manager w wersji 6.7 (zazwyczaj dostarczany z instalacją Node).
- Angular CLI w wersji 7.0
- Najnowsza wersja Angular (wersja 7)
// run the command in a terminal ng version
Potwierdź, że używasz wersji 7, i zaktualizuj do 7, jeśli nie jesteś.Inne rzeczy, które będą nice-to-haves to:
- Pracująca znajomość frameworka Angular na poziomie początkującym.
- Znajomość z usługami Angular będzie plusem, ale nie wymogiem.
Typy błędów
Istnieje wiele typów błędów, ale będę je grupował w dwóch głównych kategoriach: błędy wewnętrzne i zewnętrzne.
- Błędy wewnętrzne: (znane również jako błędy po stronie klienta) Są to te, za które możesz zostać pociągnięty do odpowiedzialności, błędy składni, błędy menedżera pakietów, błędy referencyjne, błędy typu i wszystkie rodzaje błędów po stronie klienta, które mogą być naprawione przez programistę w ramach aplikacji Angular.
- Błędy po stronie zewnętrznej: (znane również jako błędy po stronie serwera) Te mogą rozciągać się od błędów serwera, które w większości pochodzą z trzycyfrowymi kodami statusu, takimi jak 500 do błędów sieci internetowych, a nawet błędów specyficznych dla przeglądarki. Są to w zasadzie błędy, które są poza zasięgiem aplikacji Angular stąd nazwa outsider.
Ten artykuł skupi się na błędach wewnętrznych, a następnie kolejny artykuł skupi się na błędach zewnętrznych.
Baby steps: throw and catch!
Gdy uruchamiasz funkcję w JavaScript, ta funkcja dołącza do pewnego rodzaju kolejki wykonywania funkcji i jak aplikacja działa i dostaje się do swojej kolejki, opuszcza kolejkę i zostaje wykonana. Tak więc, jeśli wystąpi błąd, JavaScript rzuca wyjątek, który natychmiast usuwa wszystkie operacje w kolejce, dopóki wyjątek nie zostanie obsłużony. Na podstawowym poziomie, wyjątki są obsługiwane za pomocą bloków try/catch, cała aplikacja zawiesza się, jeśli kompilator nie widzi tego bloku try/catch. Składnia try/catch wygląda tak:
O przydatności tego rozwiązania przekonasz się w małej demonstracji. Utwórz nowy projekt Angular za pomocą CLI, nazwij go ngapp
ng new ngapp
Zaakceptuj ustawienia routera i wybierz zwykły CSS jako arkusz stylów. Przejdź do pliku app.component.ts
i skopiuj poniższy kod:
Kopiuj je do app.component.html
<!-- src/app/app.component.html --> <button (click)="normalError()"> Fire Normal Error </button>
Potem skopiuj te podstawowe stylizacje do app.component.css
Uruchom aplikację w rozwoju w ten sposób:
ng serve
W niektórych przypadkach nie uda się jej skompilować, gdy tak się stanie uruchom ją ponownie i skompiluje się.
To pokazuje w konsoli i większość czasu, łamie całą aplikację natychmiast, jak widać wiadomość, którą zalogowaliśmy nie pokazała się. Blok try/catch obsługuje te wyjątki z wdziękiem i aplikacja kontynuuje działanie. Tak więc, jeśli miałeś inny przycisk z blokiem try catch tym razem, możesz zauważyć różnicę. Skopiuj poniższy kod do pliku app.component.html file
:
Kopiuj poniższy kod do pliku app.component.ts
:
Kod pogrubioną czcionką pokazuje ten sam błąd referencji, ale tym razem jest on zawinięty w blok try-catch, więc może być obsługiwany z wdziękiem. Kiedy uruchomisz aplikację ponownie, powinna wyglądać tak:
Ograniczenia try/catch
Tak wspaniałe jak try/catch jest, myśląc o aplikacji już widzisz jak to nie jest zrównoważone. Dzieje się tak dlatego, że nie możesz iść o dodaniu tych bloków try/catch w każdej funkcji w swojej aplikacji, to nie jest efektywne pod względem zasobów. Dobrą wiadomością jest to, że Angular ma rodzaj globalnego try/catch, który możemy wykorzystać w jednym scentralizowanym miejscu, aby złapać wszystkie wyjątki.
Error handler
Angular ma globalną klasę obsługi błędów o nazwie errorHandler, która zapewnia hak do scentralizowanej obsługi wyjątków wewnątrz aplikacji. W zasadzie przechwytuje ona wszystkie błędy, które zdarzają się w aplikacji i loguje je do konsoli, a także zatrzymuje aplikację przed awarią (to dlatego Twój pierwszy przycisk nie zawiesił aplikacji).Składnia wygląda tak:
To pozwala nam zmodyfikować domyślne zachowanie logowania błędów do konsoli do naszej własnej logiki po dodaniu go do naszej listy dostawców w naszym module aplikacji. Przejdź do pliku app.component.ts
i skopiuj do niego poniższy kod:
Blok try catch został usunięty, więc powinieneś mieć dwie piskliwe linie (lub problemy) w swoim edytorze kodu oznaczające dwa błędy referencyjne. Teraz, aby przetestować globalny handler błędów Angulara, przejdź do pliku app.module.ts
i skopiuj poniższy kod:
Zmiany dokonane tak jak składnia sugeruje, że stworzyliśmy globalną klasę obsługi błędów, która implementuje handler błędów Angulara, a następnie zarejestrowaliśmy ją w sekcji provider.Our logika po prostu sprawdza błędy i rejestruje komunikat dla każdego znalezionego błędu. Jeśli zapiszesz to i uruchomisz aplikację, zobaczysz teksty zalogowane w konsoli dla każdego błędu i aplikacji działającej tak, jak to było try-catch.
Obsługa błędów
Teraz widzisz, że cała nasza logika błędów znajduje się wewnątrz modułu głównego aplikacji, nie jest to sposób w jaki Angular zachęca nas do pisania kodu. Tak więc zgodnie z utrzymaniem wszystkiego w modularności, użyjemy usługi. nazwiemy ją error service i cała logika dotycząca obsługi błędów będzie w niej przechowywana. Po pierwsze, wygeneruj usługę Angulara za pomocą CLI:
ng generate service error
lub
ng g s error
Potem musisz usunąć logikę obsługi błędów w swoim pliku app.module.ts
tak, aby wyglądał on tak:
Potem użyj CLI do wygenerowania komponentu błędu, do którego użytkownik może zostać przekierowany w przypadku wystąpienia błędu.
ng g c error
Teraz masz komponent błędu, nie musisz go modyfikować, przejdź do pliku error.service.ts
i skopiuj poniższy kod:
Tutaj logika jest trochę zmodyfikowana, aby najpierw sprawdzić rodzaj błędu, jeśli jest to błąd wewnętrzny to przekierowuje użytkownika na stronę błędu w momencie wystąpienia błędu. Więc upewnij się, że twój plik app-routing.module.ts
jest zaktualizowany o trasę w ten sposób:
W końcu twój plik app.component.html
powinien wyglądać tak:
Jeśli podążałeś za postem do tego punktu, możesz ponownie uruchomić aplikację w rozwoju, twoje błędy będą z wdziękiem obsługiwane zgodnie z oczekiwaniami.
Zakończenie
Zostałeś wprowadzony do błędów i koncepcji ich obsługi w Angular za pomocą klasy errorHandler z naciskiem na błędy JavaScript po stronie klienta. Następny tutorial będzie zagłębiał się w błędy zewnętrzne, przechwytywanie HTTP oraz śledzenie błędów za pomocą zdalnej usługi bazując na wszystkich koncepcjach, których nauczyłeś się w tym poście. Kompletny kod tego tutoriala znajduje się na GitHubie i można go znaleźć tutaj.