2016-11-29 8 views
6

Mam pytanie: w jaki sposób mogę obsłużyć wszystkie nieprzechwycone wyjątki (błąd operacji/programisty spowoduje usunięcie wszystkich usług) dla mojej aplikacji węzła. Następnie mogę wysłać do mnie powiadomienie e-mail, gdy wykryję błąd.Złap cały wyjątek UncaughtException dla aplikacji Node js

+0

u oznacza chcesz e-mail po awarii serwera węzeł? – raj

+0

Tak. Wyślij pocztę dołącz wiadomość o błędzie, aby wiedzieć, co się stało. –

Odpowiedz

3

Możesz użyć Domain API: https://nodejs.org/api/domain.html Ale jest przestarzałe i nie jest zalecane.

Ogólnie rzecz biorąc, chcesz obsługiwać błędy w dowolnym miejscu i unikać podejścia "złap wszystko".

Jeśli wystąpi błąd, zignorowanie go nie stanowi zachęty do jego naprawy, aw niektórych przypadkach może nawet nie świadczyć o nieprawidłowym działaniu programu.

Zamiast tego, najlepszym sposobem, aby sobie z tym poradzić, jest zawieszenie się programu, zarejestrowanie awarii (i zrzut stosu/rdzenia), a następnie ponowne uruchomienie automatycznie, za pomocą pm2 lub nodemon.

Dla (bardzo) długi ale wnikliwe przemówienie Joyent (twórców Node), gorąco polecam przeczytać ten link: Error handling in Node.JS

Jest też process.on('uncaughtException') zdarzenie (które powinny również nie używać)

Edytuj: Trochę więcej szczegółów i próba rozwiązania problemu. Za pomocą oprogramowania takiego jak pm2, aby ponownie uruchomić aplikację po awarii, będzie można również zobaczyć plik error.log, który da ci ślad stosu. Wydaje się więc, że jedyną rzeczą, której nadal potrzebujesz, jest ostrzeżenie o wypadku.

W tym celu możesz chcieć rzucić okiem na interfejsy takie jak keymetrics (ci sami faceci, którzy utworzyli pm2), które potencjalnie mogą ostrzegać o błędach.

Fajna rozwiązanie użyłem kiedyś, dawno dawno temu był następujący:

  • podczas uruchamiania aplikacji (re), wygląda na dzienniku błędów
  • Jeśli znajdzie, to ostrzega Ci z zawartością pliku dziennika
  • to wtedy zmienia nazwę/przenieść plik dziennika błędów w innym miejscu

ja nie polecam tego rozwiązania konieczne, ale pasuje do wszystkich specyfikacje trzeba, więc baw się dobrze z tym!

Edit2: Jeśli czujesz się jak zagłębia się tematyką rozwoju usług i najlepszych praktyk, rzucić okiem na jego linku sugerowanej przez @Paul w komentarzach: https://12factor.net/

+0

+1 dla linku do artykułu Joyenta. Zwróć także uwagę na sekcję zatytułowaną (Nie) Obsługa błędów programisty, która, jak sądzę, trafia do mięsa z pytania PO. – Paul

+1

Warto również zauważyć, że węzeł działa zgodnie z zasadą unix, co oznacza, że ​​każda aplikacja powinna dobrze działać. W przypadku chęci wysłania wiadomości e-mail po awarii aplikacji jest to poza zakresem Twojej aplikacji. Zamiast tego powodują awarię (i rejestrację), jak mówi @xShirase, a następnie mają coś innego (np. Systemd lub logwatch), biorąc to pod uwagę i wysyłając e-maile po osiągnięciu progu (nawet jeśli ten próg to "dowolny błąd"). – Paul

+0

właśnie dodałem hack, którego użyłem, gdy byłem jeszcze młody i nieuważny, aby to zrobić w samej aplikacji :) +1 dla zasady unixowej chociaż – xShirase

14

Można użyć processuncaughtException” i ' unhandledRejection "zdarzeń.

Należy również pamiętać, że nie jest bezpieczne, aby wznowić normalnego funkcjonowania po „uncaughtException”, ponieważ the system becomes corrupted:

Prawidłowe stosowanie „uncaughtException” jest do wykonywania synchronicznego porządki przydzielonych zasobów (np plik deskryptory, uchwyty itp.) przed zamknięciem procesu.

Przykład:

process 
    .on('unhandledRejection', (reason, p) => { 
    console.error(reason, 'Unhandled Rejection at Promise', p); 
    }) 
    .on('uncaughtException', err => { 
    console.error(err, 'Uncaught Exception thrown'); 
    process.exit(1); 
    }); 
+0

Może, ale nie powinien. Zobacz odpowiedź @ xShirase. – Paul

+0

Masz rację Paul. W tym celu proponuję zapisać błąd i zatrzymać program (z kodem wyjścia! == 0), aby uniknąć niezdefiniowanego stanu aplikacji. – Dario

+0

Tak, dałem +1 za to, że korzystasz z właściwej techniki *, jeśli * wybierasz się na trasę niewybuchów, chciałbym tylko podkreślić, że nie jest to najlepsza trasa i zniechęcić OP do myślenia, że ​​powinien zrobić to, co Ty mieć, a następnie osadzić jakiegoś nadawcę wiadomości e-mail w odbiorniku zdarzeń. – Paul

Powiązane problemy