是否可以从 NodeJs 的 Promise 中的 catch 块中抛出错误?
Is it possible to throw an error from a catch block in a Promise in NodeJs?
关于上下文,我正在使用 NextJs。
基本上来自我的 api 页面之一 /api/sendData.ts,我正在执行一个方法调用 process() ,它属于一个单独的 class platform.ts.
API 代码的结构(在 sendData.ts 中):
try {
platform.process(someParam);
} catch (err) {
console.log('caught error');
// do further handling here
}
platform.ts 中 process() 的实现:
SomeLibrary.request( {content} )
.then( (response) => console.log(response) )
.catch( (err) => { console.log('throwing'); throw err; } );
目前,这不会返回错误(或者至少我无法从调用者那里捕获),而是打印出“throwing”,然后是“UnhandledPromiseRejectionWarning: StatusCodeError: 401 .... ”。我也试过这个:
.catch( function(err) { throw err; } );
根据我的阅读,似乎在 catch 块中抛出错误实际上是“返回另一个承诺”,因此承诺链并未真正解决(?)或完成。
如何在 catch 块中抛出错误,以便将此错误传播回 sendData.ts 进行处理?是否有可能将错误备份起来,以便我可以从我的服务器端处理错误(nextjs 中的./api)
P.S。此线程强调了我面临的完全相同的错误,none 的回复能够解决我的问题:
要么删除 try catch 块,要么在 catch 块中抛出错误。
可能缺少等待流程功能的承诺
try {
await platform.process(someParam);
} catch (err) {
console.log('caught error');
// throw error regardless
throw err;
}
你的问题是你没有从 platform.process()
返回承诺,也没有等待那个异步函数的响应。因此你的 catch 块代码永远不会 运行 因为从 platform.process()
抛出的代码是异步的。
我会这样处理:
try {
await platform.process(someParam);
} catch (err) {
console.log('caught error');
// do further handling here
}
platform.process(下面是一个示例,因为我们看不到 platform.process 的编码方式):
function process(someParam) {
return SomeLibrary.request( {content} )
.then( (response) => console.log(response) )
.catch( (err) => {
console.log('throwing');
return Promise.reject(err);
} );
}
或(另一种写法platform.process
):
async function process(someParam) {
try{
const response = await SomeLibrary.request( {content} );
console.log(response);
catch(err) {
console.log(err);
return Promise.reject(err);
}
}
关于上下文,我正在使用 NextJs。
基本上来自我的 api 页面之一 /api/sendData.ts,我正在执行一个方法调用 process() ,它属于一个单独的 class platform.ts.
API 代码的结构(在 sendData.ts 中):
try {
platform.process(someParam);
} catch (err) {
console.log('caught error');
// do further handling here
}
platform.ts 中 process() 的实现:
SomeLibrary.request( {content} )
.then( (response) => console.log(response) )
.catch( (err) => { console.log('throwing'); throw err; } );
目前,这不会返回错误(或者至少我无法从调用者那里捕获),而是打印出“throwing”,然后是“UnhandledPromiseRejectionWarning: StatusCodeError: 401 .... ”。我也试过这个:
.catch( function(err) { throw err; } );
根据我的阅读,似乎在 catch 块中抛出错误实际上是“返回另一个承诺”,因此承诺链并未真正解决(?)或完成。
如何在 catch 块中抛出错误,以便将此错误传播回 sendData.ts 进行处理?是否有可能将错误备份起来,以便我可以从我的服务器端处理错误(nextjs 中的./api)
P.S。此线程强调了我面临的完全相同的错误,none 的回复能够解决我的问题:
要么删除 try catch 块,要么在 catch 块中抛出错误。 可能缺少等待流程功能的承诺
try {
await platform.process(someParam);
} catch (err) {
console.log('caught error');
// throw error regardless
throw err;
}
你的问题是你没有从 platform.process()
返回承诺,也没有等待那个异步函数的响应。因此你的 catch 块代码永远不会 运行 因为从 platform.process()
抛出的代码是异步的。
我会这样处理:
try {
await platform.process(someParam);
} catch (err) {
console.log('caught error');
// do further handling here
}
platform.process(下面是一个示例,因为我们看不到 platform.process 的编码方式):
function process(someParam) {
return SomeLibrary.request( {content} )
.then( (response) => console.log(response) )
.catch( (err) => {
console.log('throwing');
return Promise.reject(err);
} );
}
或(另一种写法platform.process
):
async function process(someParam) {
try{
const response = await SomeLibrary.request( {content} );
console.log(response);
catch(err) {
console.log(err);
return Promise.reject(err);
}
}