如何捕获由代理处理程序中的 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()里面的“捕获错误”永远不会被打印出来并且仍未被捕获 .
1 回答
您可以将调用包装到新Promise中的
Reflect.get(...)
(实际API方法)的返回值,捕获任何错误,记录它们,然后再次传递它们 . 同样,如果没有错误,只需解析外部Promise .您当前的代码没有捕获错误,因为异步函数未就地执行,因此错误将被抛出try块之外 .
编辑:不使用Promise构造函数的替代方法: