Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Конструктор ошибок javascript

Подскажите, как более правильно создавать ошибки в 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; }

Комментариев нет:

Отправить комментарий