如何捕获代理处理程序中Reflect.get(target, name, receiver)
异步抛出的错误?
我使用Proxy和Reflect打包 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()"内部错误"从来没有打印过,仍然没有被捕。
答案 0 :(得分: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) });
};
}
};