如何处理javascript/nodejs的catch块中发生的错误

How do I handle errors that occure in the catch block in javascript/nodejs

提问人:Oscar R 提问时间:12/27/2022 更新时间:12/27/2022 访问量:467

问:

这是我的场景:

我正在创建一个用户对象,我要将其保存到我的数据库中。在此之后,我正在做其他可能导致错误的事情。如果是这样,我需要“回滚”我对数据库所做的更改,这意味着我必须在 catch 块中再次从数据库中删除用户对象。但是,此删除操作也可能失败,这意味着我需要知道如何处理此问题?

当我说“处理”时,我的意思是我想将错误保存到我的数据库中。因此,我希望保存原始错误,并在删除失败的情况下保存错误。(我也知道将错误保存到数据库可能会失败,但如果失败了,我无能为力,所以我会让它发生)

那么我是否需要在 catch 块中使用嵌套的 try-catch?或者 catch 块会“捕获”自己的错误吗?

// psuedocode-ish illustation of what I'm working with
try {
  const new_user = Database.save(user);
  MoreCodeThatMightThrowAnError(); // imagine this throws an error
}
catch (error) {
  if (new_user) Database.delete(user); // Do I need this inside a nested try-catch?
  console.log(error);
  Database.save(error); // dont care if this fails
}

此外,这只是我正在做的事情的一个简化示例,因此我不能只是向上移动 MoreCodeThatMightThrowAnError() 或不幸地从我的数据库中使用一些内置的回滚功能。

javascript 节点.js 尝试捕获

评论

2赞 Barmar 12/27/2022
你需要在块里放另一个。try/catchcatch
1赞 jfriend00 12/27/2022
如果你想捕获和处理处理程序中的错误,那么你需要一个嵌套在处理程序中的错误,这样你就可以捕获第二个错误。catchtry/catchcatch

答:

1赞 Myzel394 12/27/2022 #1

你是对的,你需要使用另一个块。尽管这看起来有点奇怪,但有时是不可避免的。有关详细信息,请参阅此问题try-catch

0赞 undevable 12/27/2022 #2

我建议像这样组织你的代码:

// psuedocode representation
try {
  const new_user = Database.save(user);
  try {
    const otherCode = Database.otherThingThatCauseError();
  } catch(err) {
    console.log(err)
  }
  // ... and so on
} catch(err) {
  // no need to rollback, most databases are ACID-compliant
  console.log(err);

所以基本上,你会想添加另一个块。我相信您不必回滚更改,因为数据库符合 ACID 标准,因此如果在操作过程中(即创建新用户)发生错误,数据库将自动回滚整个操作。try, catch

0赞 I'mAUserNow 12/27/2022 #3

块不会捕获其中发生的错误,因此您需要使用嵌套的 try...catch 语句。catch

try {
  const new_user = Database.save(user);
  MoreCodeThatMightThrowAnError(); // imagine this throws an error
}
catch (error) {
  console.log(error);

  try {
    if (new_user) Database.delete(user);
  } catch (error2) {
    console.log(error2);

    try {
      Database.save(error2);
    } catch (error3) {}
  }
}