繁体   English   中英

如何在异步代理/反射陷阱中捕获错误

[英]How to catch error in asynchronous Proxy/Reflect trap

如何捕获代理处理程序中Reflect.get(target, name, receiver)异步引发的错误?

我正在使用ProxyReflect来包装API类,以便可以捕获任何网络异常并向用户正常显示错误消息。

//Wrapper.js

let handler = {
  get: (target, name, receiver) => {
    try {
      Reflect.get(target, name, receiver); //throws Error asynchronously
    } catch (e) {
      console.log('caught error', e);
    }
};

export default new Proxy(new API(), handler);
//App.js

import Wrapper from './Wrapper';

Wrapper.asyncFunction(); //throws uncaught Error
//API.js

class API {
  get user() {
    return new User()
  }
}
//User.js

class User {

  /**
   * List all users
   */
  all() {
    return new Promise((resolve, reject) => {
      reject(new Error('Network error'));
    });
  }
}

引发错误时,在Reflect.get()内部,“捕获的错误”将永远不会被打印,并且仍然未被捕获。

您可以在新的Promise中包装对Reflect.get(...) (实际的API方法)的返回值的调用,捕获任何错误,记录下来,然后再次传递。 同样,如果没有错误,则只需解决外部Promise。

let handler = {
  get: (target, name, receiver) => {
    return (...args) => new Promise((resolve, reject) => {
      const apiMethod = Reflect.get(target, name, receiver);
      const boundApiMethod = apiMethod.bind(target);

      boundApiMethod(...args).then(resolve, (e) => {
        console.log('caught error', e);
        reject(e);
      });
    });
  }
};

您的当前代码未捕获到该错误,因为异步函数未就地执行,因此该错误被抛出到try块之外。

编辑:一种不使用Promise构造函数的替代方法:

let handler = {
  get: (target, name, receiver) => {
    return (...args) => {
      return Reflect
        .get(target, name, receiver)
        .apply(target, args)
        .catch((e) => { console.log('caught error', e) });
    };
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM