Szukam, aby zacząć moje JavaScript nieco więcej dowodów błędzie, a ja znaleźć mnóstwo dokumentacji na temat korzystania try
, catch
, finally
, i throw
, ale nie jestem znalezieniem mnóstwo porad od ekspertów na kiedy i gdzie wrzucić błędów.
- Czy każdy fragment kodu powinien być zawinięty w try / catch?
- Czy jest więcej porad na temat tego, w którym momencie należy wykryć błędy?
- Czy istnieją wady zgłaszania błędów zamiast cichej awarii kodu podczas produkcji?
- Zostało to poruszone w SO, jeśli chodzi o implementacje, ale czy błędy JS logowania na serwerze są skuteczną strategią?
- Czy jest jeszcze coś, co powinienem wiedzieć na temat przechwytywania błędów w mojej aplikacji?
Jestem też całkowicie fanatykiem słuchania książek, które mają świetne rozdziały lub szczegółowe wyjaśnienia dotyczące obsługi błędów. Elokwentny JavaScript porusza tę kwestię, ale nie jest zbyt nakazowy ani opiniotwórczy na ten temat.
Dziękuję za wszelkie rady, których możesz udzielić!
javascript
error-handling
Joshua Cody
źródło
źródło
Odpowiedzi:
Niezwykle interesujący zestaw slajdów na temat obsługi błędów języka JavaScript w przedsiębiorstwie można znaleźć pod adresem http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/
W skrócie podsumowuje:
Slajdy są znacznie bardziej szczegółowe i najprawdopodobniej wskażą ci jakiś kierunek.
AKTUALIZACJA
Wspomnianą powyżej prezentację można znaleźć tutaj: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
źródło
Nicholas Zakas z Yahoo! fame wygłosił referat na temat Enterprise Error Handling ( slajdy ) na Ajax Experience 2008, w którym zaproponował coś takiego:
function log(sev,msg) { var img = new Image(); img.src = "log.php?sev=" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent(msg); } // usage log(1, "Something bad happened.") // Auto-log uncaught JS errors window.onerror = function(msg, url, line) { log(1, msg); return true; }
Rok później Nicholas Zakas opublikował na swoim blogu aktualizację, która zawierała sprytny wzorzec automatycznego wstrzykiwania kodu obsługi błędów do środowiska produkcyjnego (przy użyciu programowania aspektowego).
Kiedy zaczniesz rejestrować wywołania window.error, zauważysz dwie rzeczy:
Zmniejszenie ilości torrentów we wpisach dziennika jest tak proste, jak sprawdzenie ważności i / lub losowej liczby przed zalogowaniem się na serwer:
function log(sev,msg) { if (Math.random() > 0.1) return; // only log some errors var img = new Image(); img.src = "log.php?sev=" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent(msg); }
Obsługa bezużytecznych błędów „window.error w undefined: 0” zależy od architektury witryny, ale można spróbować zidentyfikować wszystkie wywołania Ajax i zgłosić wyjątek, gdy coś się nie powiedzie (prawdopodobnie zwrócenie śladu stosu za pomocą stacktrace.js ).
źródło
if (global.logJSError) if (Math.random() < .01) logJSError('bootloader', {
(co prawda, że kod nie przepustnica wszystkich błędów, tylko konkretnej klasy błędów timeout)IHMO, powinieneś używać obsługi błędów w javascript, tak jak robisz to w kilku innych językach (AFAIK: Python, Java).
Aby uzyskać lepszą czytelność (i prawdopodobnie lepszą wydajność, chociaż nie jestem pewien, czy ma to naprawdę duży wpływ), powinieneś używać bloku try / catch głównie w następujących przypadkach:
Część kodu, którą chcesz opakować, jest kluczową częścią całego algorytmu . Jeśli się nie powiedzie, może:
Wiesz, że kod, który piszesz, nie jest kompatybilny z każdą przeglądarką
W końcu eksperci javascript mogą mieć inne elementy do przekazania.
moje 2 centy do pudełka,
Pozdrowienia,
Maks
źródło
Oprócz innych odpowiedzi: jedną ważną rzeczą jest użycie danych kontekstowych dostępnych w obiektach błędów JavaScript oraz w
window.onerror
parametrach funkcji.Rzeczy takie jak stacktrace (errorObject.stack), nazwa pliku, numer linii i numer kolumny. Pamiętaj, że każda przeglądarka ma pewne różnice ... więc postaraj się, aby uzyskać ładne błędy.
Mogą nawet wystąpić problemy z samym obiektem konsoli . Używam niestandardowej funkcji window.onerror inspirowanej tym i specjalnej funkcji do śledzenia dowolnego obiektu błędu standardowego zainspirowanego tym kodem .
Innym dobrym punktem jest umieszczenie wersji aplikacji internetowej w pobliżu ścieżki stosu (w celu szybkiego i bezpiecznego kopiowania i wklejania). Możesz również wyświetlać błędy bardziej agresywnie (alert ...) w trybie programistycznym, ponieważ programiści nie będą stale monitorować konsoli przeglądarki i mogą nie widzieć niektórych problemów.
Używaj także unikaj używania
throw 'My message'
, używajthrow new Error('My message')
, możesz nawet mieć niestandardowe błędy, przeczytaj ten artykuł .Zawsze dodawaj kontekst do błędów (wersja, identyfikator obiektu, jakiś niestandardowy komunikat, ...), a także upewnij się, że rozróżniasz błędy zewnętrzne (niektóre dane zewnętrzne lub okoliczności, które spowodowały awarię systemu) i błędy wewnętrzne / assertions (twój własny system zawiódł), przeczytaj o „ Projekcie według umowy ”.
Oto przewodnik .
Pomyśl także o użyciu ogólnej obsługi błędów, takiej jak przechwytywacze, biblioteki i frameworki:
źródło
Stworzyłem do tego skrypt. Blokuje wszystkie polecenia konsoli z wyjątkiem elementów wymienionych na liście dozwolonych lub blokuje wszystko na liście bloków. Działa dobrze nawet z kolorowymi dziennikami konsoli.
https://github.com/iiic/consoleFilter.js
źródło