2015-02-23 5 views
6

Mi sento come se stessi andando un po 'pazzo, ma Angular sembra lanciare un errore per una promessa anche se ho un catch definito. Invia l'errore alla console, quindi consente di eseguire catch.Errore di registri angolari alla console prima di aumentare promise.catch

Ecco un super-simple fiddle

Il codice di prova:

$q.when(1) 
    .then(function() { 
     throw new Error("test"); 
    }).catch(function(error) { 
     console.log('error caught', error); 
    }); 

La console risultante

enter image description here (sporco bugiardo!)

Ecco a fiddle showing what I expect to happen: il catch è sollevato, e nessun altro errore viene registrato nella console. Non sono riuscito a configurare qualcosa, o Angular implementa una specifica di promessa non corretta?

risposta

6

angolare per impostazione predefinita registra tutti gli errori nella console.

angolare fornisce anche un modo per ignorare questo comportamento. $exceptionHandler è un servizio globale a cui viene data la possibilità di elaborare eventuali eccezioni ($ http, errori durante $ digest, ecc.).

Se si aggiunge questo pezzo di codice:

myApp.factory('$exceptionHandler', function() { 
    return function(exception, cause) { 
    exception.message += ' (caused by "' + cause + '")'; 
    //throw exception; 
    }; 
}); 

Poi tutti gli errori sarebbe solo smettere ulteriormente la registrazione. Elaborerebbe comunque i gestori di catch(). violino Aggiornato: http://jsfiddle.net/5jjx5rn3/

UPDATE:

Come sottolineato dai dnc253 nei commenti, c'è un modo migliore se avete intenzione di ignorare in realtà un servizio angularjs. Pur non essendo al centro di questa domanda, è meglio sapere che semplicemente dichiarando un servizio con lo stesso nome, in qualsiasi modulo, il servizio è completamente sostituito (vittorie dell'ultimo arrivato). Se si desidera aggiungere funzionalità al servizio originale, un decorator è la scelta giusta.

+0

Questa è la risposta corretta, ma è preferibile un decoratore per sovrascrivere l'intero servizio. Vedi http://stackoverflow.com/questions/13595469/how-to-override-exceptionhandler-implementation – dnc253

+0

Ma l'eccezione non arriva nemmeno a questo punto? Non dovrebbe essere stato gestito dal 'catch'? –

+0

@DavidGrinberg Il "catch" si verifica dopo la gestione che avviene in questo metodo. Ecco perché appare prima nella console – Tyrsius