Разрушение объектов ошибок работает в Chrome, но не Firefox. Что можно сделать? - PullRequest
1 голос
/ 09 апреля 2020

Представьте себе следующий фрагмент кода:

class FakeError extends Error {
  constructor(message, opts = {}) {
    super(message);
    const { description = null } = opts;
    this.description = description;
    Error.captureStackTrace(this, this.constructor);
  }
}

(() => {
  try {
    throw new FakeError('Test', { description: 'This is a test' });
  }
  catch (error) {
    console.log({ ...error, test: 'test' });
  }
})();

В Chrome это дает желаемый ответ, который должен обрабатывать ошибку, как если бы это был обычный объект:

[object Object] {
  description: "This is a test",
  test: "test"
}

Однако в Firefox он просто игнорирует свойства, добавленные в расширение прототипа:

[object Object] {
  test: "test"
}

Существует ли известная причина для этого? Есть ли что-то, что я могу сделать, чтобы это работало в разных браузерах?

1 Ответ

2 голосов
/ 09 апреля 2020

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

Проверьте исправление:

class FakeError extends Error {
  constructor(message, opts = {}) {
    super(message);
    const { description = null } = opts;
    this.description = description;
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, this.constructor);
    }
  }
}

(() => {
  try {
    throw new FakeError('Test', { description: 'This is a test' });
  }
  catch (error) {
    console.log({ ...error, test: 'test' });
  }
})();
...