在 JavaScript 中,尝试 {} 而不捕获 {} 是否可行?

2022-08-30 02:21:17

我有许多函数,它们要么返回某些内容,要么抛出错误。在 main 函数中,我调用了其中每个函数,并希望返回每个函数返回的值,或者如果第一个函数引发错误,则继续执行第二个函数。

所以基本上我目前拥有的是:

function testAll() {
    try { return func1(); } catch(e) {}
    try { return func2(); } catch(e) {} // If func1 throws error, try func2
    try { return func3(); } catch(e) {} // If func2 throws error, try func3
}

但实际上我只想返回它(即如果它没有抛出错误)。我不需要块。但是,像这样的代码会失败,因为它缺少一个(未使用的)块。trycatchtry {}catch {}

我在jsFiddle上放了一个例子

那么,有没有办法在达到相同效果的同时删除这些块?catch


答案 1

不带 catch 子句的 try 会将其错误发送到下一个较高的 catch 或窗口(如果该 try 中没有定义 catch)。

如果没有 catch,则 try 表达式需要 finally 子句。

try {
    // whatever;
} finally {
    // always runs
}

答案 2

ES2019开始,可以有一个空的捕获块,没有错误变量。这称为可选 catch 绑定,在 2018 年 6 月发布的 V8 v6.6 中实现。该功能自Node 10Chrome 66Firefox 58Opera 53Safari 11.1起可用。

语法如下所示:

try {
  throw new Error("This won't show anything");
} catch { };

你仍然需要一个块,但它可以是空的,你不需要传递任何变量。如果你根本不想要一个 catch 块,你可以使用 /,但请注意,它不会像空捕获那样吞噬错误。catchtryfinally

try {
  throw new Error("This WILL get logged");
} finally {
  console.log("This syntax does not swallow errors");
}