Чтобы вызывать ошибки в наших приложениях JavaScript, мы обычно используем объект, являющийся экземпляром конструктора Error.

В этой статье мы рассмотрим, как расширить конструктор JavaScript Error нашим собственным конструктором.

Создайте нашу собственную функцию-конструктор

Один из способов расширить встроенный конструктор Error - создать собственный конструктор, который получает данные из конструктора Error.

Например, мы можем написать:

function MyError(message) {
  this.name = 'MyError';
  this.message = message;
  this.stack = (new Error()).stack;
}
MyError.prototype = new Error();
throw new MyError('error occurred')

Мы создаем конструктор MyError, который принимает параметр message.

Мы устанавливаем message как значение свойства message.

И мы получаем трассировку стека из свойства stack экземпляра Error.

Мы устанавливаем MyError.prototype на новый экземпляр Error, так что экземпляр MyError также является экземпляром Error.

В конструкторе мы устанавливаем name, который будет регистрироваться при возникновении ошибки.

Затем мы бросаем экземпляр MyError с ключевым словом throw.

Как только ошибка будет выдана, мы должны увидеть ее в журнале.

И если мы log myError instanceof Error и myError instanceof MyError, мы должны увидеть, что оба true, поскольку мы устанавливаем MyError.prototype на новый Error экземпляр.

Используйте синтаксис класса и расширяет ключевое слово для расширения конструктора ошибок

Синтаксис класса добавлен в ES6, чтобы мы могли легко создавать конструкторы, которые наследуют конструкторы.

Однако под синтаксическим сахаром все еще используется прототипное наследование, как в предыдущем примере.

Чтобы расширить конструктор Error, мы пишем:

class MyError extends Error {
  constructor(message) {
    super(message);
    this.name = 'MyError';
  }
}
const myError = new MyError('error occurred')
console.log(myError instanceof Error)
console.log(myError instanceof MyError)
throw myError

Мы создаем класс MyError с ключевым словом extends, чтобы создать подкласс класса Error.

constructor принимает параметр message, и мы передаем его в конструктор Error, вызывая super.

Мы также устанавливаем в конструкторе собственное свойство name.

А затем мы создаем экземпляр класса MyError так же, как и раньше.

И если мы используем оператор instanceof для Error и MyError, мы увидим, что они оба true.

Когда мы выдаем ошибку, мы видим сообщение, как и раньше.

Заключение

Мы можем использовать обычное прототипное наследование или синтаксис класса, чтобы создать собственный конструктор, который наследует данные от конструктора Error.

Больше контента на plainenglish.io