【问题标题】:Try-catch-rethrow - proper patternTry-catch-rethrow - 正确的模式
【发布时间】:2018-07-03 20:37:53
【问题描述】:

如果我有这样的代码:

let result;
try {
    result = doSomethingThatCanThrow();
} catch (e) {
    throw new Error(`Thrown error because <some info> ${e}`)
}

// do something with result if didn't throw

这是 JS 中的有效模式吗?我不喜欢使用let。我更喜欢const,但在这种情况下我不能使用它,因为它在try-catch 块之外不可用。

我可以将整个代码放在 try 块中并摆脱 let 但在我看来它会更难阅读:

try {
    const result = doSomethingThatCanThrow();
    // do something with result if didn't throw
} catch (e) {
    throw new Error(`Thrown error because <some info> ${e}`)
}

请记住,它总是可以增长的。

我也可以随时跳过重新抛出,但我想在错误中添加更多信息。

哪个选项更好,为什么?还有其他可能吗?

【问题讨论】:

  • 您有什么理由不想使用 var 而不是 let 或 const?两者都是块作用域,其中 var 是全局的。
  • 有什么要求?
  • 使用var 会导致更多的错误。使用var 也更难调试代码

标签: javascript try-catch


【解决方案1】:

您可以使用finally

(async(doSomethingThatCanThrow) => {

  let result;
  try {
    result = await doSomethingThatCanThrow();
  } catch (e) {
    throw new Error(`Thrown error because <some info> ${e}`)
  } finally {
    if (result !== undefined) {
      // do something with result if didn't throw
      console.log(result);
    } else {
      console.log(result);
    }
  }
  // do stuff 
})(() => Promise.reject(123))
.catch(err => console.error(err));

【讨论】:

  • 你还在用let
  • 具体要求不使用let吗?
  • @Daniel 使用const 而不是let 的用例是什么?请注意,原始问题专门询问“还有其他可能性吗?”
【解决方案2】:

尝试一个测试条件,看看变量result是否为空!

var result
try {
    result = "This time it worked!";
} catch (e) {
    throw new Error(`Thrown error because <some info> ${e}`)
}

if (result) {
    console.log(result)
}

var result
try {

} catch (e) {
  }

// do something with result if didn't throw

if (!result) {
    // var result undefined
    // Result not thrown!
    console.log("Failed")
}

【讨论】:

    【解决方案3】:

    在这种情况下,我认为避免 let 的唯一真正方法(除了使用 var 作为另一个响应建议 - 不要那样做)是将这个 try-catch 提取到一个函数中并直接返回结果使用 try 块,即

    const doSomethingThatCanThrowAndRethrowWithUpdatedMessageIfFails = () => {
      try {
        return doSomethingThatCanThrow();
      } catch (e) {
        throw new Error(`Thrown error because <some info> ${e}`);
      }
    }
    
    const result = doSomethingThatCanThrowAndRethrowWithUpdatedMessageIfFails();
    

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2011-11-17
      • 1970-01-01
      • 2023-04-04
      • 2010-11-04
      相关资源
      最近更新 更多