Javascript 如何包装来自第三方api的错误?

Javascript 如何包装来自第三方api的错误?,javascript,Javascript,我确实使用第三方API来管理身份验证操作 可用方法返回承诺,假设一个createUser方法,我可以这样调用它: this.auth.createUser(data).then(() => alert('user created')); 好的,到目前为止 如果我确实发送了无效数据,或者如果我打破了一些先决条件,API就会抛出一些包含大量数据和信息的大错误。问题是这些错误对用户不友好 我正在尝试包装这些方法,这样我就可以抛出一个已知的错误(特定的标记),并向用户提供更好的消息,但到目前为止

我确实使用第三方API来管理身份验证操作

可用方法返回承诺,假设一个
createUser
方法,我可以这样调用它:

this.auth.createUser(data).then(() => alert('user created'));
好的,到目前为止

如果我确实发送了无效数据,或者如果我打破了一些先决条件,API就会抛出一些包含大量数据和信息的大错误。问题是这些错误对用户不友好

我正在尝试包装这些方法,这样我就可以抛出一个已知的错误(特定的标记),并向用户提供更好的消息,但到目前为止我还无法做到这一点

我构建了以下代码段:

类身份验证{ createUser(…args){ 返回新承诺((解决、拒绝)=>{ 设置超时(()=>{ 此.log(…args); 抛出新错误(“身份验证服务抛出一些错误,其中包含大量不友好的细节和信息”); }, 3000); }); } log(…args){console.log('this',…args)} } const auth=new auth(); Object.keys(auth.forEach)(key=>{ if(验证[键]的类型='函数'){ const originalFunction=auth[key]; auth[key]=函数(){ 试一试{ 返回originalFunction.apply(这是参数); }捕获(e){ 此.log('error',e); 抛出新错误('Error-auth-'+namefunctionstag(key)); } }; }否则{ console.log(type of auth[key]); } }); 函数名FunctionStag(名称){ 返回name.replace(/(?!^[A-Z]/g,c=>'-'+c.toLowerCase()); } 身份验证日志(“身份验证服务”); auth.createUser(1,2,3,4,5); //应为:错误身份验证创建用户
//已接收:身份验证服务抛出一些错误,其中包含大量不友好的详细信息和信息使用承诺中的resolve和reject

这里(您的代码):

您可以做什么:

function asyncError(){
    return new Promise(function(resolve, reject){
        // ... code
        reject(new Error('Error ...'));
        // ... code
    })

}

async function test(){
    try{
        const experiment = await asyncError();
    }
    catch(e){
        console.log(e)
    }
}
其他方式(无需等待即可捕获):


在承诺中使用决心和拒绝

这里(您的代码):

您可以做什么:

function asyncError(){
    return new Promise(function(resolve, reject){
        // ... code
        reject(new Error('Error ...'));
        // ... code
    })

}

async function test(){
    try{
        const experiment = await asyncError();
    }
    catch(e){
        console.log(e)
    }
}
其他方式(无需等待即可捕获):


当您注册一个承诺,甚至一个setTimeout时,您并不是在同一堆栈上下文中调用该函数。实际上,您是在告诉引擎注册回调,系统将在稍后使用正确的参数调用它。正因为如此,错误永远不会出现在try/catch中。您可以在异步函数中使用await关键字来暂停执行并在稍后返回,从而维护相同的上下文,这将保留此处使用的try/catch块。这就是你在这里需要做的。签出:

当您注册承诺,甚至setTimeout时,您并不是在同一堆栈上下文中调用该函数。实际上,您是在告诉引擎注册回调,系统将在稍后使用正确的参数调用它。正因为如此,错误永远不会出现在try/catch中。您可以在异步函数中使用await关键字来暂停执行并在稍后返回,从而维护相同的上下文,这将保留此处使用的try/catch块。这就是你在这里需要做的。签出:

刚刚发现了主要问题:
Object.keys(auth)
在类实例上返回空数组

在将其更改为
Object.getOwnPropertyNames(Object.getPrototypeOf(auth))
之后,我可以专注于你们帮助我的承诺:)

我的最后一个工作片段是这样结束的:

this.auth.createUser(data).then(() => alert('user created'));
类身份验证{ createUser(…args){ 返回Promise.resolve()。然后(()=>{ 此.log(…args); 抛出新错误(“身份验证服务抛出一些错误,其中包含大量不友好的细节和信息”); }); } log(…args){console.log('this',…args)} } const auth=new auth(); Object.getOwnPropertyNames(Object.getPrototypeOf(auth)).forEach(key=>{ if(key=='constructor')返回; if(验证[键]的类型='函数'){ const originalFunction=auth[key]; auth[key]=函数(){ 返回承诺。解决() .then(()=>originalFunction.apply(这个,参数)) .catch(e=>{ 此.log('error',e.message); 抛出新错误('Error-auth-'+namefunctionstag(key)); }); }; } }); 函数名FunctionStag(名称){ 返回name.replace(/(?!^[A-Z]/g,c=>'-'+c.toLowerCase()); } 身份验证日志(“身份验证服务”);
auth.createUser(1,2,3,4,5).catch(e=>console.log('final error:',e.message))刚刚发现了主要问题:
Object.keys(auth)
在类实例上返回空数组

在将其更改为
Object.getOwnPropertyNames(Object.getPrototypeOf(auth))
之后,我可以专注于你们帮助我的承诺:)

我的最后一个工作片段是这样结束的:

this.auth.createUser(data).then(() => alert('user created'));
类身份验证{ createUser(…args){ 返回Promise.resolve()。然后(()=>{ 此.log(…args); 抛出新错误(“身份验证服务抛出一些错误,其中包含大量不友好的细节和信息”); }); } log(…args){console.log('this',…args)} } const auth=new auth(); Object.getOwnPropertyNames(Object.getPrototypeOf(auth)).forEach(key=>{ if(key=='constructor')返回; if(验证[键]的类型='函数'){ const originalFunction=auth[key]; auth[key]=函数(){ 返回承诺。解决() .then(()=>originalFunction.apply(这个,参数)) .catch(e=>{ 此.log('error',e.message); 抛出新错误('Error-auth-'+namefunctionstag(key)); }); }; } }); 函数名FunctionStag(名称){ 返回name.replace(/(?!^[A-Z]/g,c=>'-'+c.toLowerCase()); } 身份验证日志(“身份验证服务”);
auth.createUser(1,2,3,4,5).catch(e=>console.log('final error:',e.message))setTimeout中的抛出与抛出i的上下文不同