【问题标题】:Is it possible to throw an error from a catch block in a Promise in NodeJs?是否可以从 NodeJs 的 Promise 中的 catch 块中抛出错误?
【发布时间】:2021-03-03 02:22:25
【问题描述】:

对于上下文,我正在使用 NextJs。

基本上从我的一个 api 页面 /api/sendData.ts,我正在做一个方法调用 process(),它属于一个单独的类 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; } );

目前,这不会抛出错误(或者至少我无法从调用者那里捕获),而是打印出“抛出”,然后是“UnhandledPromiseRejectionWarning:StatusCodeError:401 .....” .我也试过这个:

.catch( function(err) { throw err; } );

根据我的阅读,似乎在 catch 块中抛出错误实际上是“返回另一个承诺”,因此承诺链并没有真正解决(?)或完整。

如何在 catch 块中抛出错误,以便可以将此错误传播回 sendData.ts 进行处理?甚至可以将错误冒泡备份,以便我可以从服务器端处理错误(nextjs 中的./api)

附:该线程突出显示了我面临的完全相同的错误,并且没有一个响应能够解决我的问题:UnhandledPromiseRejectionWarning: This error originated either by throwing inside of an async function without a catch block

【问题讨论】:

  • 代替throw err;试试return Promise.reject(err);
  • 另外,你需要 await platform.process() 或者你的外部 try catch 什么都不做。同样为了这个工作,你需要从platform.process()返回承诺

标签: node.js next.js es6-promise


【解决方案1】:

您的问题是您没有返回来自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);
  } );
}

OR(另一种写法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);
  }
}

【讨论】:

  • 哇,你是对的。正是因为 process() 不是返回承诺的人。我已经使用了 Promise.reject(err) 方法并且它有效!非常感谢,我一整天都在坚持这个!
【解决方案2】:

要么删除 try catch 块,要么在 catch 块中抛出错误。 可能缺少等待进程功能的承诺

try {
  await platform.process(someParam);
} catch (err) {
  console.log('caught error');
  // throw error regardless
  throw err;
}

【讨论】:

  • 我不确定这将如何工作;目前甚至没有打印“捕获错误”消息,这意味着错误甚至没有从承诺中的 catch 块中成功抛出,对吧?
  • SomeLibrary.request( {content} ) 是这个函数上面的 try catch 块吗?
  • 可能是 try 块中缺少 await 吗?
  • 是的,request()方法在process()内部被调用,在try catch块中。
  • 我尝试在platform.process()之前添加'await'关键字,还是一样;没有打印控制台日志,所以仍然没有抛出错误。
猜你喜欢
  • 2017-06-29
  • 2021-08-27
  • 2017-06-20
  • 1970-01-01
  • 2020-11-20
  • 2010-09-12
  • 1970-01-01
  • 2016-05-22
  • 2023-04-08
相关资源
最近更新 更多