Скажем, если у меня есть класс

class Foo {
  doSomething() { throw 'error'; }
  doOtherthing() { throw 'error2'; }
  handleError(e) {}
}

Есть ли какая-либо реализация для автоматического перехвата / перехвата любой ошибки, возникающей в этом классе, и перенаправления ее в метод обработки ошибок, в данном случае handleError()

Например

const foo = new Foo()
foo.doSomething() 

Это должно вызвать errorHandler (). В Angular есть такая реализация, и я не уверен, как это было сделано.

5
Fan Cheung 19 Окт 2020 в 11:58

1 ответ

Лучший ответ

Вы можете систематически заключить каждый метод в оболочку обработки ошибок:

for (const name of Object.getOwnPropertyNames(Foo.prototype))
  const method = Foo.prototype[name];
  if (typeof method != 'function') continue;
  if (name == 'handleError') continue;
  Foo.prototype.name = function(...args) {
    try {
      return method.apply(this, args);
    } catch(err) {
      return this.handleError(err, name, args);
    }
  };
}

Обратите внимание, это означает, что handleError должен либо повторно вызвать исключение, либо иметь возможность возвращать результат для всех методов класса (который, конечно, может быть undefined).

Для асинхронных методов вы должны проверить, является ли возвращаемое значение обещанием, а затем прикрепить обработчик ошибок с .catch() перед его возвратом.

5
Bergi 27 Окт 2020 в 23:48