Подскажите, как более правильно создавать ошибки в Javascript из прототипа так, чтобы с ними удобнее было работать. Например, если я создаю ошибку таким образом, то выбрасывая исключение, нужно вызывать constructor, опять же, проверяя на принадлежность ошибки к моему классу, снова приходится дергать constructor
var SpecificError = Object.create(Error.prototype);
SpecificError.constructor = function(message) {
this.name = 'Specific Error';
this.message = message;
this.stack = (new Error).stack;
return this;
};
SpecificError.constructor.prototype = SpecificError;
JSFiddle
Ответ
Судя по всему здесь хотелось использовать наследование.
Для этого нужно было сделать SpecificError функцией конструктором
function SpecificError(message){
...
}
Внутри его вызвать конструктор базового класса, в данном случае Error
Error.call(this,message);
а далее установить прототип
SpecificError.prototype = Object.create(Error.prototype);
Но, наследоваться от Error не так просто, так как его конструктор не оперирует с this и следовательно не добавит в него автоматом нужные свойства.
Но, можно использовать решение из этого ответа, сохранить полученный экземпляр Error, назначить ему name и использовать его stack
function SpecificError(message, name) {
var err = Error.call(this, message);
err.name = this.name = (name || 'SpecificError');
err.message = this.message = message;
Object.defineProperty(this, 'stack', {
get: function() {
return err.stack;
}
});
}
Измененный пример из JSFiddle
function SpecificError(message, name) {
var err = Error.call(this, message);
err.name = this.name = (name || 'SpecificError');
err.message = this.message = message;
Object.defineProperty(this, 'stack', {
get: function() {
return err.stack;
}
});
}
SpecificError.prototype = Object.create(Error.prototype);
function OtherError(message) {
SpecificError.call(this, message, 'OtherError');
}
OtherError.prototype = Object.create(SpecificError.prototype);
try {
throw new OtherError('Very specific error');
} catch (e) {
if (e instanceof OtherError) {
console.log(e);
console.log(e.stack);
} else
throw e;
}
Комментариев нет:
Отправить комментарий