Podręcznik
Obsługa błędów w Node.js
process.on
Do obsługi błędów w asynchronicznych programach w Node.js, wykorzystujących funkcje callback, można używać obiektu process:
// kod znajdujący się w tym bloku zostanie wykonany,
// gdy wystąpi nieprzechwycony wyjątek.
// wypisanie treści błędu w kanale stderr
console.error(`Uncaught Exception: ${err}`);
// tu powinny nastąpić porządki:
// zamykanie uchwytów do plików itp.
// zakończenie działania programu
process.exit(1)
})
Obiekt process jest instancją klasy EventEmitter, która służy do obsługi zdarzeń. Metoda on, dostępna w tej klasie, przyjmuje dwa argumenty wejściowe:
Pierwszy z nich określa rodzaj zdarzenia, a drugi – funkcję, która ma być wywołana, gdy zdarzenie danego rodzaju będzie miało miejsce.
Zdarzenia uncaughtException mają miejsce:
- gdy w trakcie wykonywania programu występuje błąd JavaScript;
- w wyniku wywołania polecenia throw, np.:
Metoda exit obiektu process powoduje zatrzymanie działania programu (ang. terminate) z zadanym kodem – w szczególności:
- kod 0 oznacza "sukces", tzn. zakończenie wykonywania programu zgodnie z planem;
- kod 1 oznacza zakończenie wykonywania programu w wyniku nieobsłużonego błędu.
We fragmencie kodu przytoczonym na początku niniejszego podrozdziału, jako reakcja na zdarzenia typu uncaughtException określona jest funkcja anonimowa, która:
- wypisuje treść błędu, otrzymaną jako argument wejściowy err;
- powinna wykonywać wszelkie porządki, które wymagane są przed zatrzymaniem wykonywania programu (np. zamknięcie otwartych uchwytów do plików);
- zatrzymuje działanie programu z kodem 1.
Przykładowy program, w którym wykorzystane jest powyższe podejście:
// Wczytanie pliku o nazwie "my_file.txt"
fs.readFile('my_file.txt', 'utf8', (err, data) => {
if (err) { // podczas próby wczytania pliku nastąpił błąd
throw err; // "wyrzucenie" błędu, czyli wywołanie zdarzenia uncaughtException
}
// wypisanie zawartości pliku w wierszu poleceń
// (ma miejsce tylko, jeśli nie wystąpił błąd)
console.log(data);
});
// Obsługa błędów
process.on('uncaughtException', err => {
console.error(`Uncaught exception: ${err}`);
process.exit(1)
})
Metodę process.on można również wykorzystać do obsługi odrzuconych promises. Należy wówczas „przechwytywać” zdarzenia unhandledRejection:
console.error('Unhandled rejection at:', promise, 'reason:', reason);
});
Literatura