Ho ereditato una base di codice sul posto di lavoro che contiene una dozzina di esempi del seguente schema:Le promesse in AngularJS catturano ogni eccezione/errore?
var promise = null;
try {
promise = backendService.getResults(input);
}
catch (exception) {
console.err(exception);
}
if (promise !== null) {
promise.then(function (response) {
// do stuff
})
.catch(function (error) {
console.err(error);
});
}
Dove backendService
è un servizio angolare che a sua volta chiama un servizio REST attraverso $http
.
Quindi, ecco la mia domanda: è che provare/prendere davvero necessario? Ci sarà mai qualche scenario in cui viene generato un particolare errore/eccezione che non riesce a intercettare lo .catch
della promessa?
Questa è stata oggetto di un po 'di dibattito sulla squadra per tutta la mattina, e l'unica soluzione che è venuta in mente è che non lo facciamo pensano è necessario, ma (a) la modifica si rompe i test che sono stati scritti al suo fianco (che dovrebbero anche essere modificati), e (b) bene ... è la codifica difensiva, giusto? Non è una brutta cosa.
I meriti di preoccuparsi effettivamente di refactoring nel dimenticatoio quando ci sono cose più importanti da fare non sono quello che sto chiedendo, però. Voglio solo sapere se è un modello ragionevole quando le promesse vengono passate in questo modo (in AngularJS in particolare, se questo fa la differenza), o solo la paranoia.
la sua non è necessario. puoi avere solo il tuo 'then()' e 'catch()' –
mi sembra che sia solo parzialmente utile. Se si dispone di un'eccezione nel codice che attiva l'XHR (presumibilmente) per ottenere i risultati, questo codice verrà catturato, ma in genere quel codice è molto più noto e non soggetto alle eccezioni di runtime. La parte difficile è la risposta del server: è molto più probabile che ci sia un'eccezione a causa del fatto che il servizio restituisce qualcosa che non ti aspetti. Questo sarebbe gestito dal rifiuto della promessa. Non penso che il try/catch sia necessario se stai gestendo 'input' in modo sicuro (normalmente) nel tuo servizio. – pherris
Sarebbe relativamente facile da testare. Inizia introducendo errori di sintassi nel metodo di vario tipo, sia prima della chiamata $ http che all'interno della sua callback, e poi finisci con il test degli errori http come 404 500 e l'errore CORS. La mia ipotesi sarebbe che. Cattura cattura tutto dopo l'avvio della richiesta http e la promessa viene restituita, ma non prima. –