2010-09-17 12 views
100

in JavaScript, supponiamo che io voglio per eseguire alcune di pulizia quando un'eccezione accade, ma lasciate l'eccezione continuano a propagarsi lo stack, ad esempio:Come posso rilanciare un'eccezione in Javascript, ma preservare lo stack?

try { 
    enterAwesomeMode(); 
    doRiskyStuff(); // might throw an exception 
} catch (e) { 
    leaveAwesomeMode(); 
    throw e; 
} 
doMoreStuff(); 
leaveAwesomeMode(); 

Il problema con questo codice è che la cattura e rethrowing le cause di eccezione le informazioni di traccia dello stack fino a quel punto vanno perse, in modo che se l'eccezione viene successivamente catturata di nuovo, più in alto nello stack, la traccia dello stack si riduce solo al rilancio. Questo fa schifo perché significa che non contiene la funzione che ha effettivamente gettato l'eccezione.

Come si è visto, ha try..finally lo stesso comportamento, in almeno Chrome (cioè, non è ri-throw che è il problema precisamente, ma la presenza di un blocco gestore di eccezioni affatto.)

Qualcuno sa di un modo per rilanciare un'eccezione in Javascript ma preservare la traccia dello stack ad essa associata? In caso contrario, per quanto riguarda i suggerimenti per altri modi per aggiungere gestori di cleanup sicuri per l'eccezione, mentre si acquisiscono anche tracce dello stack complete quando si verifica un'eccezione?

Grazie per tutti i puntatori :)

+7

0x3a28213a - in attesa di mio grazie ;-) – bacar

+0

Dupe: https://stackoverflow.com/questions/5249960/javascript-rethrowing-an-exception-preserving-the-stack-trace – MatthewMartin

+0

Questa domanda dovrebbe essere chiuso perché si riferisce a un bug di Chrome risolto nel 2012. –

risposta

53

Questo è un bug in Chrome. Risanare un'eccezione dovrebbe preservare la traccia di chiamata.

http://code.google.com/p/chromium/issues/detail?id=60240

non so di qualsiasi soluzione.

Finalmente non vedo il problema. Vedo le eccezioni in silenzio che non vengono visualizzate nella console degli errori in alcuni casi dopo un alla fine, ma sembra essere stato risolto in build di sviluppo.

+13

Questo bug sembra essere stato risolto. – mzedeler

15

La proprietà pila di un oggetto Error viene creato allo stesso tempo come l'oggetto Error in sé, non al punto è gettato. Sono spesso lo stesso a causa del linguaggio

 
    throw new Error("message"); 

e se si utilizza il codice esattamente come hai scritto, la proprietà dello stack sarà non essere modificate quando si rigenerare l'errore.

+1

Questo non è vero (forse dipende dalla piattaforma). Il motore js che sto usando ora (Rhino) reimposta lo stack sull'istruzione throw, perdendo lo stack originale. –

+0

Forse sì, ma rhino-1.7.7.2.jar non lo cambia. Che versione stai usando? –

Problemi correlati