簡體   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