2009-08-06 12 views
13

Come sviluppatore C# io sono abituato al seguente stile di gestione delle eccezioni:Come accedere eccezioni in JavaScript

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

Output 
------ 

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

sua davvero semplice, e tuttavia mi dice tutto quello che ho bisogno di sapere su ciò che l'eccezione è stata e dov'era.

Come ottengo la cosa equivalente in JavaScript in cui l'oggetto di eccezione stesso potrebbe essere solo una stringa. Ho molta voglia di essere in grado di conoscere l'esatta linea di codice in cui l'eccezione è accaduto, tuttavia il seguente codice non registra nulla di utile a tutti:

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 (di nuovo): Giusto per chiarire, questo è per applicazioni interne che fanno un uso pesante di JavaScript. Sto cercando un modo per estrarre informazioni utili dagli errori JavaScript che potrebbero essere rilevati nel sistema di produzione: ho già un meccanismo di registrazione, voglio solo un modo per ottenere una stringa sensibile da registrare.

risposta

3

È possibile utilizzare quasi nello stesso modo vale a dire.

try 
{ 
    throw new Error("hahahaha!"); 
} 
catch (e) 
{ 
    alert(e.message) 
} 

Ma se si vuole ottenere il numero di riga e il nome in cui è gettato errore suppongo che non esiste una soluzione crossbrowser. Il messaggio e il nome sono le uniche proprietà standard dell'oggetto Error. In mozilla hai anche proprietà lineNumber e fileName.

+0

Questo non funziona sul lato server. Inoltre, non è UX moderno. –

2

non sono sicuro se sia o non sia cross browser o se è quello che state cercando, ma vi consiglio di provare:

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

Lo so, sono 4 anni di ritardo alla festa qui , ma sentivo ancora l'impulso di aggiungere i miei 2 centesimi.

Come sottolineato da Eldar, è possibile utilizzare e.message per ottenere il messaggio dell'eccezione. Tuttavia, in Chrome, Firefox e IE10 +, puoi anche ottenere la traccia dello stack usando e.stack. La traccia dello stack includerà il numero di file e di riga dell'eccezione.

Quindi, per assemblare una stringa con informazioni eccezione, si potrebbe scrivere qualcosa di simile:

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

noti che si otterrà solo una traccia dello stack se

  1. l'eccezione è stato gettato dal browser (come in risposta a un errore di sintassi );
  2. l'oggetto eccezione è un oggetto Error o ha l'oggetto Error come prototipo.

Quindi, basta lanciare una stringa (lanciare "Eccezione !!") non ti darà una traccia di stack.

Per fare un po 'di più, per catturare tutte le eccezioni non rilevate, si utilizzerà un gestore window.onerror (simile al gestore di Application_Error .Net in global.asax).Lo svantaggio di questo era (e in gran parte lo è ancora) che questo non ti dava accesso all'oggetto di eccezione reale, quindi non si poteva ottenere la traccia dello stack. Riceverai solo il messaggio, l'url e il numero della linea.

Recentemente, lo standard è stato esteso per darvi la colonna (ottimo per i file minified) e l'oggetto eccezione così: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent

Proprio ora (aprile 2014), solo Chrome 32 implementa tutto questo. IE10 + ti fornisce la colonna ma non l'oggetto di eccezione. Firefox 28 ti dà ancora solo messaggio, url e numero di linea. Spero che questo migliorerà presto. Ho scritto su questo per il progetto JSNLog, a: http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging

(disclaimer: io sono l'autore di JSNLog e jsnlog.com)

In secondo luogo, l'oggetto eccezione .NET supporta eccezioni interne. Ha anche una proprietà Data in modo che sia possibile associare coppie di valori chiave ad esempio a valori variabili. Ho perso questo tipo di errore nell'oggetto Errore JavaScript, quindi ho creato il mio oggetto Exception, anch'esso come parte del progetto JSNLog. Si trova nel file jsnlog.js nel progetto github jsnlog.js (https://github.com/mperdeck/jsnlog.js).

Descrizione e ': http://jsnlog.com/Documentation/JSNLogJs/Exception

Infine una spina spudorato - il progetto JSNLog cui sto lavorando consente di inserire nel vostro logger JavaScript, e inserisce automaticamente i messaggi di log nel log lato server esistente. Quindi, per registrare le eccezioni JavaScript con i loro stack al vostro log lato server, è sufficiente scrivere:

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

Conosco _sono_ 3 anni di ritardo alla festa ... ma sono abbastanza sicuro che se si lancia un'eccezione reale (non solo una stringa), si otterrà la traccia dello stack. In questo modo: 'lanciare una nuova eccezione ('Eccezione !!');'. – samson

22

Non si specifica se si lavora nel browser o il server. Se è la prima, c'è un nuovo metodo di console.error e e.stack proprietà:

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

Si prega di tenere presente che l'errore funziona su Firefox e Chrome, ma non è standard. Un esempio veloce che il downgrade a console.log e registrare e se non c'è e.stack:

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

molto utile, grazie –

Problemi correlati