2012-03-05 18 views
6

Jaki jest najlepszy sposób w węźle na obsłużenie nieobsłużonych oczekiwań wychodzących z kodu węzłowego? Mam proces działający w tle, który uruchamia i przeszukuje zawartość sieci Web i będzie działał przez długi czas bez problemu, ale co jakiś czas pojawia się nieoczekiwany wyjątek i nie mogę sprawnie go obsłużyć. Zwykłym winowajcą wydaje się być problem z siecią (utracona łączność), w której nie powiodą się połączenia HTTP. Wszystkie utworzone przeze mnie funkcje są zgodne ze wzorcem FUNCTION_NAME (błąd, zwrócony_dana), ale w sytuacjach, w których wystąpił błąd, nie widzę żadnej z funkcji utworzonych w stosie wywołań, który został wydrukowany, a zamiast tego jest wyświetlany niektóre z podstawowych modułów węzła. Nie martwię się o te nieczęste błędy i ich główną przyczynę, celem tego posta jest po prostu staranie się znaleźć wdzięczny sposób radzenia sobie z tymi wyjątkami.Obsługa wyjątków węzła

Próbowałem umieścić próbę/catch na najwyższym poziomie mojego kodu, gdzie wszystko działa pod, ale nie wydaje się uchwycić te wyjątki. Czy dobrą praktyką w węźle jest używanie try/catch we wszystkich funkcjach niższego poziomu, które używają dowolnego kodu źródłowego? Czy istnieje sposób na globalne przechwytywanie wszystkich nieobsługiwanych wyjątków?

Dzięki

Chris

zaktualizowana DODAJ stos

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
Error: connect Unknown system errno 10060 
    at errnoException (net.js:642:11) 
    at Object.afterConnect [as oncomplete] (net.js:633:18) 
+0

Czy możesz skopiować stos niektórych z tych niezamkniętych stosów wyjątków? – seppo0010

+0

Właśnie dodałem wydruk stosu do głównego pytania z jednego z ostatnich błędów. Było to dla mnie kłopotliwe, ponieważ nie zawierało w nim żadnego kodu. –

+0

Którą wersję węzła używasz? Pytam, ponieważ numery linii nie pasują do mojej lokalnej kopii. – seppo0010

Odpowiedz

4

Czy istnieje jakiś sposób, aby globalnie uchwycić wszystkie nieobsłużone wyjątki?

Możesz przechwytywać wszystkie wyjątki za pomocą metody process.on ("uncaughtException"). Odsłuchanie tego zdarzenia pozwoli uniknąć domyślnej akcji drukowania stosu i wychodzenia z niego. Należy jednak pamiętać, że ignorowanie wyjątków może prowadzić do problemów podczas wykonywania aplikacji.

Link: http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception

zwrócić uwagę na poradę dokumentacja:

Zauważ, że uncaughtException jest bardzo surowy mechanizm obsługi wyjątków. Użycie polecenia try/catch w twoim programie zapewni ci większą kontrolę nad przepływem twojego programu. Szczególnie w przypadku programów serwerowych, które mają pozostać w nieskończoności, wyjątek UncaughtException może być przydatnym mechanizmem bezpieczeństwa.

1

Aby złapać błędy sieciowe i uniknąć domyślnego zachowania (drukowanie stosu i wyjście), należy słuchać zdarzeń "błędów".

Na przykład

var net = require('net'); 
var client = net.connect(80, 'invalid.host', function() { 
    console.log("Worked"); 
}) 
client.on('error', console.log); 
0

Mam ułożyła TYMCZ obsługi błędów, które dzienniki i e-maile mnie o nieobsługiwany wyjątek spowodowany. następnie (opcjonalnie) próbuje ponownie uruchomić serwer.

Check it out!

1

Pisałem o tym niedawno w http://snmaynard.com/2012/12/21/node-error-handling/. Nowością węzła w wersji 0.8 są domeny i pozwala łączyć wszystkie formy obsługi błędów w jedną łatwiejszą do zarządzania formę. Możesz o nich przeczytać w moim poście oraz w docs.

Możesz używać domen do obsługi argumentów błędu wywołania zwrotnego, emulatorów zdarzeń błędów i wyjątków w jednym miejscu.Problem w tym konkretnym przypadku polega na tym, że jeśli nie obsługujesz emulatora zdarzeń błędu, węzeł domyślnie wypisze ślad stosu i wyjdzie z aplikacji.