Próbuję zaimplementować moduł dla błędów niestandardowych.Błędy niestandardowe i przechwytywanie bluebirda z ErrorClass prowadzą do niezamierzonego zachowania
powinna istnieć możliwość wystąpienia pojedynczego błędu wewnątrz require-zestawieniu aplikacji przy użyciu tego modułu:
var MyCustomError = require('custom-error')('MyCustomError');
Jest to moduł:
'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;
require-one-liner powyżej działa do tej pory.
Teraz w mojej służbie, chcę nadrobić ten błąd wyraźnie:
var MyCustomError = require('custom-error')('MyCustomError')
// ...
return fooService.bar()
.catch(MyCustomError, function (error) {
logger.warn(error);
throw error;
})
Gdybym odrzucić obietnicę fooService.bar w moim teście rzucając MyCustomError to działa świetnie.
ALE, działa to tylko dlatego, że mój test i usługa używają w tym samym wystąpieniu z MyCustomError.
Na przykład, jeśli usunę mechanizm buforowania w moim module błędów niestandardowych, przechwycenie nie zostanie już osiągnięte/wykonane, ponieważ użytkownik nie rozumie, że dwa błędy są tego samego typu:
function createCustomError(name) {
//if (!_CACHE[name]) {
initError(name);
//}
return _CACHE[name];
}
specyficzny kodeks postępowania Bluebird mieści się w catch_filter.js, można rzucić okiem right here.
Chociaż podejście to działa w mojej aplikacji, będzie to szybciej prowadzić do problemów, gdy wiele modułów korzysta z modułu niestandardowego błędu, a udostępnianie tych samych wystąpień nie jest już podawane.
Jak mogę dostać tej koncepcji i działa przez nie porównującego instancje, ale typ błędzie sama?
Cheers,
Christopher
Hi Esailija, ponieważ nie zalogowany kilka dni reputacja nie został automatycznie przypisane do ciebie. Na szczęście dla ciebie, ale skoro jesteś programistą bluebird, zasługujesz na to dość :) Kod: Nie rozumiem, w jaki sposób to zatwierdza obsługę? Mówisz o klasycznej obsłudze try-catch niezależnie od bluebird? –
@ Christopher Będzie to dla bluebird tylko – Esailija
Tak właśnie robię w powyższym przykładzie - jak "catch (Errors.Entity.IllegalState.predicate, ..)" –