2009-08-06 17 views
13

Jako C# deweloperem Jestem przyzwyczajony do poniższej stylu obsługi wyjątków:Jak wyjątki zalogować JavaScript

try 
{ 
    throw SomeException("hahahaha!"); 
} 
catch (Exception ex) 
{ 
    Log(ex.ToString()); 
} 

Output 
------ 

SomeNamespace.SomeException: hahahaha! 
    at ConsoleApplication1.Main() in ConsoleApplication1\Program.cs:line 27 

Jej naprawdę proste, a jednak mówi mi wszystko, co trzeba wiedzieć o tym, co było wyjątkiem i gdzie to było.

Jak osiągnąć równoważną rzecz w JavaScript, gdzie sam obiekt wyjątku może być po prostu ciągiem znaków. Naprawdę chcę, aby móc poznać dokładną linię kodu, gdzie wyjątek wydarzyło się jednak następujący kod niczego nie przydatnych w ogóle zalogować:

try 
{ 
    var WshShell = new ActiveXObject("WScript.Shell"); 
    return WshShell.RegRead("HKEY_LOCAL_MACHINE\\Some\\Invalid\\Location"); 
} 
catch (ex) 
{ 
    Log("Caught exception: " + ex); 
} 

Output 
------ 

Caught exception: [object Error] 

EDIT (znowu): Just do wyjaśnienia, to jest przeznaczona do wewnętrznej aplikacji, która intensywnie wykorzystuje JavaScript. Jestem po sposobie wydobywania użytecznych informacji z błędów JavaScriptu, które mogą zostać przechwycone w systemie produkcyjnym - mam już mechanizm rejestrowania, chcę tylko sposobu na uzyskanie sensownego ciągu do zalogowania.

Odpowiedz

3

Można używać prawie w taki sam sposób, tj.

Ale jeśli chcesz uzyskać numer linii i nazwę pliku, w którym błąd został zgłoszony, to nie ma rozwiązania crossbrowser. Wiadomość i nazwa są jedynymi standardowymi właściwościami obiektu Error. W mozilli masz również właściwości lineNumber i fileName.

+0

To nie działa na serwerze. Ponadto nie jest to nowoczesny UX. –

2

nie jestem pewien, czy to jest cross przeglądarki lub jeśli to, czego szukasz, ale proponuję spróbować:

window.onerror = function (err, file, line) { 
    logError('The following error occurred: ' + 
    err + '\nIn file: ' + file + '\nOn line: ' + line); 
    return true; 
} 
15

wiem, że jestem 4 lata późno do partii tutaj , ale wciąż odczuwałem potrzebę dodania 2 centów.

Jak wskazuje Eldar, można użyć e.message, aby uzyskać komunikat o wyjątku. Jednak w przeglądarkach Chrome, Firefox i IE10 + możesz także pobrać stos za pomocą e.stack. Śledzenie stosu będzie zawierać plik i numer wiersza wyjątku.

Więc zebrać ciąg z informacją wyjątku, by napisać coś takiego:

var exmsg = ""; 
if (e.message) { 
    exmsg += e.message; 
} 
if (e.stack) { 
    exmsg += ' | stack: ' + e.stack; 
} 

pamiętać, że będzie można dostać tylko ślad stosu jeśli

  1. wyjątek został rzucony przez przeglądarkę (na przykład w odpowiedzi na błąd składni );
  2. Obiekt wyjątku jest obiektem błędu lub obiekt błędu jest jego prototypem.

Po prostu wyrzucenie napisu (throw 'Exception !!') nie da ci śladu stosu.

Aby zrobić to nieco dalej, aby uchwycić wszystkie nieprzechwycone wyjątki, użyłbyś obsługi window.onerror (podobnej do obsługi .Net Application_Error w global.asax).Wadą tego (i nadal jest) jest to, że nie dałoby to dostępu do rzeczywistego obiektu wyjątku, więc nie można uzyskać śledzenia stosu. Otrzymasz tylko wiadomość, adres URL i numer linii.

Ostatnio, standard został przedłużony, aby dać Ci kolumnę (świetny dla plików minified) oraz obiekt wyjątku, a także: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent

Teraz (kwiecień 2014) tylko Chrome 32 wdraża to wszystko. IE10 + podaje kolumnę, ale nie obiekt wyjątku. Firefox 28 nadal daje tylko wiadomość, adres URL i numer linii. Mamy nadzieję, że wkrótce to się poprawi. Pisałem o tym do projektu JSNLog, pod adresem: http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging

(Zastrzeżenie: Jestem autora JSNLog i jsnlog.com)

drugie Wyjątek obiekt NET obsługuje wewnętrzne wyjątki. Ma również właściwość Data, dzięki czemu można dołączyć pary wartości kluczy, na przykład wartości zmiennych. W pewnym sensie przegapiłem to w obiekcie JavaScript Error, więc utworzyłem własny obiekt Exception, również jako część projektu JSNLog. Znajduje się w pliku jsnlog.js w projekcie Github jsnlog.js (https://github.com/mperdeck/jsnlog.js).

opis jest pod adresem: http://jsnlog.com/Documentation/JSNLogJs/Exception

wreszcie bezwstydna - projektu JSNLog pracuję nad pozwala wstawić rejestratorów w JavaScripcie i automatycznie wstawia opisy zmian w istniejącym dzienniku po stronie serwera. Tak aby zalogować wyjątki JavaScript z ich ślady stosu do logu po stronie serwera, wystarczy napisać:

try { 
    ... 
} catch (e) { 
    JL().fatalException("something went wrong!", e); 
} 
+0

Wiem, że jestem 3 lata spóźniony na imprezę ... ale jestem prawie pewien, że jeśli rzucisz faktyczny wyjątek (nie tylko ciąg), otrzymasz ślad stosu. W ten sposób: 'throw new Exception ('Exception !!');'. – samson

22

Nie określić, czy pracują w przeglądarce lub serwera. Jeśli to jest to pierwsze, pojawiła się nowa metoda i e.stackconsole.error nieruchomości:

try { 
    // do some crazy stuff 
} catch (e) { 
    console.error(e, e.stack); 
} 

Proszę pamiętać, że błąd będzie działać na Firefox i Chrome, ale nie jest to norma. Szybki przykład, że będzie downgrade do console.log i zalogować e jeśli nie ma e.stack:

try { 
    // do some crazy stuff 
} catch (e) { 
    (console.error || console.log).call(console, e.stack || e); 
} 
+0

bardzo przydatne, dzięki –