Javascript ES5/ES6类和错误处理

Javascript ES5/ES6类和错误处理,javascript,sentry,mobx-react,Javascript,Sentry,Mobx React,比如说我有一节这样的课 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); //

比如说我有一节这样的课

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)


我是否可以创建一个基类,它将自动用Sentry.caputreException()修饰我的catch语句。或者每次我看到错误时都必须手动写入

您可以使用
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
  }
}

您可以定义一个decorator来重用该逻辑,并修饰可以抛出的方法:

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
  } 
}

我通常会在sentry调用中添加额外的日志记录,以便在错误中有更多数据,因为异常是无用的。你可以定义一些函数,但是你基本上写的是相同的东西,只是跳过了你要复制和粘贴的东西。我得到的错误消息实际上非常有用。所以我不介意只记录原始错误。就我而言,他们中的大多数人都来自firebase API,这不是我真正想要的。我想要的是一个可扩展类,它可以捕获任何错误并报告它。在不提前知道函数签名的情况下。哦,这看起来很完美。实际上我遇到了一个问题。实际上我遇到了一个问题,比如说我有以下代码:catchError decorator不再处理try时抛出的异常,catch block我更新了答案以处理异步情况,它有用吗?还没有时间去尝试。。。但是看起来不错。谢谢你的帮助。我们今天晚些时候会给你回复