如何处理javascript/nodejs的catch块中出现的错误

pgx2nnw8  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(161)

下面是我的设想:
我正在创建一个用户对象,并将其保存到数据库中。在此之后,我正在执行其他操作,这可能会导致错误。如果是这样,我需要“回滚”对数据库所做的更改,这意味着我必须在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()或使用数据库中的一些内置回滚功能。

ogsagwnx

ogsagwnx1#

你是对的,你需要使用另一个try-catch块.尽管这看起来有点奇怪,但有时是不可避免的.

qxgroojn

qxgroojn2#

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

// 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);

基本上,您可能希望添加另一个try, catch块。我相信您不必回滚更改,因为数据库是ACID兼容的,所以如果在操作过程中发生错误(例如创建新用户),数据库将自动回滚整个操作。

rsl1atfo

rsl1atfo3#

catch块不会捕获发生在它内部的错误,因此您需要使用嵌套的try...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) {}
  }
}

相关问题