Expecting the Unexpected – Best practices for Error handling in Angular

HttpInterceptor

A HttpInterceptor az Angular 4.3.1 verziójával került bevezetésre. Lehetőséget biztosít a HTTP-kérések és válaszok elfogására, hogy átalakítsuk vagy kezeljük őket, mielőtt továbbadnánk őket.

Két felhasználási esetet valósíthatunk meg az interceptorban.

Először is, egyszer vagy többször is újrapróbálhatjuk a HTTP-hívást, mielőtt hibát dobnánk. Bizonyos esetekben, például ha időtúllépést kapunk, folytathatjuk anélkül, hogy dobnánk a kivételt.

Ezért használjuk az RxJS retry operátorát, hogy újra feliratkozzunk a megfigyelhetőre.

További példák az ilyen viselkedésre:

  • Egy megfigyelhető szekvencia újratöltése hiba esetén egyéni kritériumok alapján
  • A RxJS ereje az exponenciális visszahívás használatakor

Ezután ellenőrizhetjük a kivétel állapotát, hogy 401 nem engedélyezett hibáról van-e szó. Token alapú biztonság esetén megpróbálhatjuk frissíteni a tokent. Ha ez nem működik, akkor átirányíthatjuk a felhasználót a bejelentkezési oldalra.

Itt egyszer újrapróbáljuk, mielőtt ellenőriznénk a hiba státuszát, és újra eldobnánk a hibát. A biztonsági tokenek frissítése nem tartozik ennek a cikknek a tárgykörébe.

Az általunk létrehozott interceptort is meg kell adnunk.

Értesítések

Az értesítésekhez az Angular Material Snackbar-t használom.

Ezzel egyszerű értesítéseket kap a felhasználó, ha hiba történik.

A szerveroldali és kliensoldali hibákat különbözőképpen tudjuk kezelni. Értesítések helyett megjeleníthetünk egy hibaoldalt.

Hibaüzenet

A hibaüzenetek számítanak, és ezért kell, hogy legyen valamilyen jelentésük, hogy segítsék a felhasználót a továbblépésben. A “Hiba történt” megjelenítésével nem mondjuk el a felhasználónak, hogy mi a probléma, vagy hogyan oldja meg azt.

Ezzel szemben, ha ehelyett valami olyasmit mutatunk, hogy “Sajnálom, elfogyott a pénze.”, akkor a felhasználó tudja, hogy mi a hiba. Kicsit jobb, de nem segít neki a hiba megoldásában.

Még jobb megoldás lenne, ha azt mondanánk, hogy utaljon még pénzt, és megadnánk egy linket egy pénzátutalási oldalra.

Ne feledjük, hogy a hibakezelés nem helyettesíti a rossz UX-et.

Azt értem ez alatt, hogy ne legyenek elvárt hibák. Ha a felhasználó megtehet valamit, ami hibát dob, akkor javítsd ki!

Ne engedj át egy hibát csak azért, mert egy szép hibaüzenetet készítettél hozzá.

Naplózás

Ha nem naplózzuk a hibákat, akkor csak az a felhasználó tud róluk, aki belefut. Az információk elmentése azért szükséges, hogy később a hiba elhárítására is lehetőségünk legyen.

Ha már eldöntöttük, hogy tároljuk az adatokat, azt is meg kell választanunk, hogy hogyan mentjük el őket. Erről később bővebben.

Cyanid & Boldogság

Hová mentsük az adatokat?

A központosított hibakezeléssel nem kell nagyon sajnálnunk, hogy későbbre hagyjuk a döntést. Már csak egy helyen kell módosítanunk a kódunkat. Egyelőre naplózzuk az üzenetet a konzolra.

Hibakövetés

A webes alkalmazásunkban előforduló hibákat még azelőtt szeretnénk azonosítani, hogy a felhasználók találkoznának velük. A hibakövetés a problémák proaktív azonosításának és a lehető leggyorsabb kijavításának folyamata.

Ezért nem dőlhetünk hátra, és nem várhatjuk el, hogy a felhasználók jelentsenek nekünk hibákat. Ehelyett proaktívnak kell lennünk a hibák naplózásával és nyomon követésével.

A hibákról akkor kell tudnunk, amikor azok bekövetkeznek.

Ezért létrehozhatjuk a megoldásunkat. Azonban miért találnánk fel újra a kereket, amikor annyi kiváló szolgáltatás létezik, mint például a Bugsnag, a Sentry, a TrackJs és a Rollbar, amelyek erre a területre specializálódtak.

Egy ilyen front-end hibakövetési megoldás használatával rögzíthetjük és visszajátszhatjuk a felhasználói munkameneteket, így a saját szemünkkel láthatjuk, hogy pontosan mit tapasztalt a felhasználó.

Ha nem tudsz reprodukálni egy hibát, akkor nem tudod kijavítani.

Más szóval, egy megfelelő hibakövetési megoldás figyelmeztethet, ha hiba lép fel, és betekintést nyújthat abba, hogyan lehet megismételni/megoldani a problémát.

Egy korábbi cikkben, a Hogyan küldjünk hibákat a Slackbe az Angularban, beszéltem a Slack használatáról a hibák követésére. Példaként itt is használhatnánk:

Egy robusztusabb megoldás megvalósítása nem tartozik ennek a cikknek a tárgykörébe.