Przechwytywanie wszystkich nieobsługiwanych wyjątków JavaScript


113

Próbuję znaleźć lub wymyślić sposób, aby wyświetlić w polu alertu wszystkie nieobsłużone wyjątki javascript w aplikacji. Chciałbym, aby wszystko to było robione po stronie klienta, bez używania kodu po stronie serwera. Używam MVC3 jako środowiska.

Szukałem przez ostatnie kilka dni i nie znalazłem dokładnie tego, czego szukam.

Znalazłem poniżej 2 sposoby, które wydają się być prawie tym, czego szukam, z wyjątkiem tych sposobów, które są skonfigurowane tak, że musisz przekazać nazwę funkcji do niestandardowej metody, aby wydrukować ślad stosu wszystkich nieobsłużonych wyjątków w tym jednym określonej funkcji. Szukam sposobu, aby nie musieć ręcznie przekazywać nazwy funkcji do metody niestandardowej, która drukuje ślad stosu wszystkich nieobsłużonych wyjątków. Chciałbym, aby ta niestandardowa metoda po prostu „nasłuchiwała” wszystkich nieobsłużonych wyjątków w całej aplikacji.

http://eriwen.com/javascript/js-stack-trace/

Również coś podobnego do poprzedniego linku:

https://github.com/eriwen/javascript-stacktrace

Oto podstawowy kod z drugiego linku powyżej, który wyświetla ślad stosu określonej funkcji javascript:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

Podsumowując, czy wszyscy znacie jakiś sposób, aby mieć jakiegoś „nasłuchującego”, który nasłuchuje wszystkich nieobsłużonych wyjątków javascript, a następnie wyświetla je na ekranie w polu ostrzegawczym?

Dzięki! Jason


jedno ... wy, czy użyłbyś pola ostrzegawczego?!? możesz użyć console.log (komunikat_błędu), aby ...
Mathlight,

1
Myślę, że to pytanie Złap wszystkie błędy JS pomoże ci
Pilgerstorfer Franz

Prawdopodobnie powinieneś rzucić okiem na to pytanie: stackoverflow.com/questions/205688/ ...
Mark

Odpowiedzi:


130

Możesz to zrobić za pomocą metody window.onerror.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
O wiele lepsze niż próba umieszczenia całej mojej aplikacji w bloku try / catch. :) Dzięki!
Anthony

15
Tylko ostrzeżenie: „Zauważ, że niektóre / wiele zdarzeń błędów nie wyzwala window.onerror, musisz ich specjalnie nasłuchiwać.” - developer.mozilla.org/en-US/docs/Web/API/ ...
shusson

6
nie ma potrzeby uwzględniania nazwy funkcji (myErrorHandler) w tym kodzie ... może być tylko funkcję (ErrorMsg, url, LineNumber)
JoelFan

18
@JoelFan lepiej mieć nazwę funkcji do celów debugowania. Debuger użyje nazwy funkcji zamiast wyświetlać ją jako funkcję anonimową.
Jerinaw,

To jest niesamowite i dzięki! próbowałem debugować złożony skrypt do powiększania zdjęć, który działa dobrze w 100% przypadków, z wyjątkiem mobilnych safai, gdzie losowo się nie udaje i gdzie nie ma okna „konsoli” lub „programisty”, aby zobaczyć, co się stało. Jasne, że mam własne okno „debugowania”, które mogę włączyć za pomocą tajnego przycisku, ale nie miałem możliwości globalnego wyświetlenia każdego błędu, którego nie wykonałem. Ten dodatek pokazał mi DOKŁADNIE, gdzie był problem i oszczędził mi wyrywania większej ilości włosów! Chciałbym móc dwukrotnie głosować w górę!
Randy

48

Możesz użyć window.onerrorlub (zadziwiająco!) Powiązać ze zdarzeniem „błąd”:

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Jeśli chcesz śledzić błędy JavaScript, możesz spróbować Atatus . Pracuję w Atatus.


7
dlaczego „zwracasz fałszywe” stwierdzenie?
kumaresan_sd

@kumaresan_sd pozwala na uruchomienie domyślnej obsługi zdarzeń: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ ...
Jens Bodal

29

Oprócz

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Możesz także wyłapać wszystkie błędy wywołane wewnątrz wywołania zwrotnego promise ( .then()) nasłuchującego unhandledrejectionzdarzenia

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
Czy konieczne jest użycie obu window.onerrori window.addEventListener("error"czy użycie jednego z nich jest wystarczające?
Tormod Haugene

2
Możesz użyć jednego z nich. Jeśli używasz window.addEventListener("error", wyślij useCapturezestaw do true, aby wyłapać również błędy elementów, które się nie pojawiły. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ ...
Javier Perez

1
Dziękuję Ci!! errorWydarzenie nie zwracają moją szczególną błąd. unhandledrejectionale to rozumiem.
joe

throw new Error('tja');nie jest złapany w najnowszy chrome z takim podejściem ...
OZZIE

1
@JavierPerez, które testowałem przy użyciu v80, załączyłem zdarzenie i bezpośrednio potem wyrzuciłem błąd i nie został złapany, nie złapałem też błędów składniowych.
OZZIE

1

Sprawdź http://log4javascript.org , jest oparty na Log4J. Jeśli większość twojego kodu jest opakowana w instrukcje try / catch do obsługi wyjątków, możesz użyć tej biblioteki jako wspólnego interfejsu do wysyłania danych wyjściowych do zawsze dostępnego "okna dialogowego" lub okna logowania, które może zobaczyć twój użytkownik końcowy. Możesz nawet mieć przycisk, który wykonuje funkcję window.print (), aby wydrukować zawartość okna dialogowego na drukarce lub w pliku PDF. Powodzenia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.