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:

process.on('uncaughtException', err => {
  // 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:

process.on([eventName], [listener])

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.:
throw new Error("[opis błędu]");

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:

const fs = require('fs');  // moduł służący do operacji na plikach

// 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:

process.on('unhandledRejection', (reason, promise) => {
  console.error('Unhandled rejection at:', promise, 'reason:', reason);
});

Literatura