Sto tentando di implementare un modulo per errori personalizzati.Gli errori personalizzati e la cattura di bluebird con ErrorClass causano un comportamento involontario
Dovrebbe essere possibile creare un'istanza di un errore particolare ai richiedere-dichiarazione delle app utilizzando questo modulo:
var MyCustomError = require('custom-error')('MyCustomError');
Questo è il modulo:
'use strict';
var _CACHE = {};
function initError(name) {
function CustomError(message) {
this.name = name;
this.message = message;
}
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;
_CACHE[name] = CustomError;
}
function createCustomError(name) {
if (!_CACHE[name]) {
initError(name);
}
return _CACHE[name];
}
module.exports = createCustomError;
L'richiedere-one-liner sopra sta funzionando finora.
Ora, nel mio servizio, voglio prendere questo errore in modo esplicito:
var MyCustomError = require('custom-error')('MyCustomError')
// ...
return fooService.bar()
.catch(MyCustomError, function (error) {
logger.warn(error);
throw error;
})
Se rifiuto la promessa di fooService.bar nel mio test lanciando una MyCustomError questo sta lavorando molto.
MA, questo funziona solo perché il mio test e il servizio utilizzano la stessa istanza di MyCustomError.
Ad esempio, se rimuovo il meccanismo di memorizzazione nella cache nel mio modulo di errore personalizzato, il catch non verrà più raggiunto/eseguito, perché bluebird non capisce che i due errori sono dello stesso tipo:
function createCustomError(name) {
//if (!_CACHE[name]) {
initError(name);
//}
return _CACHE[name];
}
Il codice specifico di gestione bluebird si trova nel catch_filter.js, è possibile dare un'occhiata a right here.
Sebbene l'approccio funzioni all'interno della mia app, questo causerà problemi prima che più moduli utilizzino il modulo errore personalizzato e la condivisione delle stesse istanze non venga più fornita.
Come posso ottenere questo concetto operativo entro non confrontando le istanze, ma il tipo di errore stessa?
Cheers,
Christopher
Hi Esailija, dato che non ho collegato un paio di giorni la reputazione ha ottenuto automaticamente assegnato. Fortunato per te, ma dal momento che sei lo sviluppatore di Bluebird te lo meriti abbastanza :) Il codice: non vedo il tuo punto su come questo approvi la manipolazione? Parli del classico pilotaggio del catch-catch indipendentemente dal bluebird? –
@ChristopherQuesto è solo per bluebird – Esailija
Quindi questo è esattamente quello che sto facendo nell'esempio sopra - come 'catch (Errors.Entity.IllegalState.predicate, ..)' –