Классы Javascript ES5 / ES6 и обработка ошибок - PullRequest
0 голосов
/ 12 февраля 2019

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

class SomeUIComponentDataStore {
    async function getUser() {
         try { //do something that can fail}
         catch(e) { 
           // gracefully fail, setting portion of ui to fail state
           Sentry.captureException(e); // report to some metrics service
         } 
    } 
}

Я повторяю этот шаблон для каждой асинхронной функции.В случае сбоя я отвечаю на ошибку, а затем сообщаю о ней какой-либо службе (в данном случае это служба Sentry).

В любом случае я могу создать BaseClass, который автоматически украсит мой оператор catch с помощью Sentry.caputreException ().Или я должен вручную написать это каждый раз, когда я вижу ошибку.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вы можете определить декоратор для повторного использования этой логики и декорировать методы, которые могут выдавать:

function catchError(target, name, descriptor) {
  const original = descriptor.value;
  if (typeof original === 'function') {
    descriptor.value = function(...args) {
      try {
        return original.apply(this, args);
      } catch (e) {
        Sentry.captureException(e); // report to some metrics service
      }
    }
  }
}

function catchErrorAsync(target, name, descriptor) {
  const original = descriptor.value;
  if (typeof original === 'function') {
    descriptor.value = async function(...args) {
      try {
        return await original.apply(this, args);
      } catch (e) {
        Sentry.captureException(e); // report to some metrics service
      }
    }
  }
}

class SomeUIComponentDataStore {
  @catchErrorAsync
  async getUser() {
    //do something that can fail
  }

  @catchError
  otherMethod() {
    //do something that can fail
  } 
}
0 голосов
/ 12 февраля 2019

Вы можете создать базовый класс с Sentry.captureException(e);, а затем иметь переопределяемые функции для пользовательской функции try / catch.

class BaseClass {
  function onGetUser() {
    throw new Error("Method not implemented");
  }

  function onGetUserFail() {
    throw new Error("Method not implemented");
  }

  async function getUser() {
    try {
      onGetUser();
    } catch (e) {
      onGetUserFail();
      Sentry.captureException(e);
    }
  }
}

class SomeUIComponentDataStore extends BaseClass {
  function onGetUser() {
    // do something
  }

  function onGetUserFail() {
    // do something
  }
}
...