2015-10-27 1 views
7

Desidero che il browser mostri un messaggio di errore quando si verifica un errore di tipo.
errori come non possono leggere la proprietà qualcosa di indefinito o riferimento non definito.es6 promette errori di tipo rondine

new Promise(function(resolve,reject){ 
    // do stuff ... 
    reject('something logical is wrong'); 
}).catch(e => console.error(e)); 

new Promise(function(resolve,reject){ 
    // do stuff, and a syntax error :/ 
    var a = { }; 
    a.something.otherthing = 1; /* we have an error here */ 
    // ... 
}).catch(e => console.error(e)); 

Nel primo esempio l'errore è un uno logico, e la sua fine per catture nella fermo (..) blocco.
Ma nel secondo esempio si tratta di un chiaro errore di sviluppo, che accade sempre mentre si sviluppano nuove cose. Non voglio prenderlo, voglio che il browser mi mostri l'errore come altri errori nella console. Desidero poter attivare la pausa chrome sulle eccezioni e visualizzare lo stato di altre variabili. Voglio vedere la traccia dello stack in console.
Voglio che si comporti come un errore normale.

Qualche idea?

+0

Utilizzo il tuo secondo esempio, ottengo il seguente errore nella mia console 'TypeError: Impossibile impostare la proprietà 'otherthing' di undefined'. Non è questo ciò che vuoi che accada? La promessa è rimasta in sospeso, ma questo è un problema diverso. – AdamJeffers

+0

voglio il numero di riga dell'errore, traccia dello stack. –

+0

@AdamJeffers voglio usare anche * chrome * break on exceptions. –

risposta

5

A differenza di eccezioni nel codice sincrono, che diventano non rilevata appena codice restituisce al inattività, un browser in genere non conosce la fine logica di una promessa a catena, che è dove un errore asincrono poteva essere considerato non catturato. Le catene sono assemblate dinamicamente, dopotutto, e quindi meglio essere terminate con un finale .catch all'estremità logica della catena, vale a dire l'equivalente asincrono di inattività.

Avere un finale .catch(e => console.error(e)) mi sembra molto ragionevole, ma hai ragione che i browser tendono a visualizzare questi errori in modo diverso dalle eccezioni non rilevate. Se si desidera vengano visualizzati la stessa, è possibile utilizzare questo trucco:

.catch(e => setTimeout(() => { throw e; })) 

Questo getterà e, contenente l'analisi dello stack e il numero di linea originale, nel ciclo successivo, e al di fuori della catena di promessa, dove nulla lo prenderà e verrà segnalato come non catturato. Usiamo setTimeout per superare il comportamento predefinito di .catch, che è quello di catturare eventuali eccezioni in-chain nel caso in cui si intende continuare a concatenare.

Con questo, spero che tu veda che qualsiasi differenziazione tra "logico" e altri errori è irrilevante. L'errore che si verifica fino alla coda della catena è fatale per la catena, ovvero non bloccata (anche se ovviamente puoi triage "logico" da altri errori nella cattura finale e visualizzarli in modo diverso se lo desideri).

2

cromo ha un'opzione Pausa eccezioni fermati in Fonti scheda, ho attivato questa opzione e Pausa eccezioni funzione sta lavorando bene ora.

+1

Questo si interromperà sia sull'errore logico che su "TypeError", quindi questo non sembra corrispondere ai criteri della tua stessa domanda. – jib