首页 文章

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

提问于
浏览
2

如何捕获由代理处理程序中的 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()里面的“捕获错误”永远不会被打印出来并且仍未被捕获 .

1 回答

  • 4

    您可以将调用包装到新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) });
        };
      }
    };
    

相关问题