在JavaScript中尝试{}没有catch {}?

pim*_*vdb 101 javascript return function try-catch

我有许多函数可以返回一些东西或抛出错误.在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
}
Run Code Online (Sandbox Code Playgroud)

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

在jsFiddle上举了一个例子.

那么,是否有任何方法可以catch在实现相同效果的同时移除这些块?

ken*_*bec 206

一个 尝试没有赶上条款将其错误到下一个更高的渔获,或窗口,如果没有试图内定义的渔获物.

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

try {
    // whatever;
} finally {
    // always runs
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,[没有捕获的尝试不会吞下错误](/sf/ask/403487521/#56404126)。 (4认同)
  • 上面的评论没有准确回答OP,因为如果函数1成功,他不想运行函数2。 (3认同)

Dan*_*scu 16

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

语法如下所示:

try {
  throw new Error("This won't show anything");
} catch { };
Run Code Online (Sandbox Code Playgroud)

您仍然需要一个catch块,但是它可以为空,并且不需要传递任何变量。如果根本不需要catch块,则可以使用try/ finally,但请注意,它不会像空catch那样吞没错误。

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

  • 这个答案是最新的!在执行顺序方面, 1. 它尝试 `try` 块。2. 捕获错误。3. 执行 `finally` 块。4. 抛出错误。这样对吗? (4认同)

Thi*_*ter 12

不,你必须保留它们.

这实际上是有道理的,因为根本不应该忽略错误.

  • 有时空的捕获很有意义,所以我不同意你的观点. (50认同)
  • 这个答案实际上是不正确的,你可以`try {}; 最后 {}` 如 http://stackoverflow.com/a/5764505/68210 所示 (38认同)
  • 在这种情况下,这些函数不应该抛出错误,而是返回例如`null`,并执行类似`return func1()||的操作 func2()|| FUNC3();` (16认同)
  • 这个答案实际上是不正确的并且具有误导性。你说“这实际上是有道理的”,但你错了,它只在某些情况下有意义,而在其他情况下则不然。这是一个糟糕的答案被莫名其妙地接受的一个很好的例子。在很多情况下,没有 catch 块是有意义的,例如有时在“async”函数中。被 JavaScript 语言强制创建空的“catch”块*显然*是毫无意义的。 (13认同)
  • @DanielXMoore,没有`catch(e){}`,`func1()`抛出的异常将阻止`func2()`的尝试. (4认同)
  • @DanielXMoore:但这不是问题的关键所在. (3认同)
  • 曾经使用过`JSON.parse`?它会抛出一个解析错误但我不能依赖传入的信息来总是100%解析它所以它必须是这样的:`try {handleMessage(JSON.parse(message))} catch(e){}`I如果js有一个自动捕获,如果省略,我认为这将是很好的. (3认同)
  • @ThaJay完全正确.同样,有时父对象中可能存在或不存在对象(浏览器兼容性?).它更容易'try {some.buried.object.method(); ``而不是做一个大块的`typeof ..!='undefined'`链的`if`块. (2认同)

ale*_*lex 10

不,catch(或finally)是try朋友,并始终作为try/catch的一部分.

但是,将它们清空是完全有效的,就像在您的示例中一样.

在示例代码的注释中(如果func1抛出错误,请尝试func2),看起来你真正想要做的就是调用前一个catch块内的下一个函数.


Joe*_* B. 6

我不建议不带catch的try-finally,因为在我自己的测试中,如果try块和finally块都抛出错误,那么finally子句中抛出的错误就会冒泡,并且try块的错误将被忽略:

try {
  console.log('about to error, guys!');
  throw new Error('eat me!');
} finally {
  console.log ('finally, who cares');
  throw new Error('finally error');
}
Run Code Online (Sandbox Code Playgroud)

结果:

>     about to error, guys!
>     finally, who cares
>     .../error.js:9
>         throw new Error('finally error');
>         ^
>     
>     Error: finally error
Run Code Online (Sandbox Code Playgroud)

  • 我想说你需要确保你的“finally”块足够简单,不会抛出任何异常。 (3认同)

Ita*_*hav 5

不,不可能有try块而没有catch(或finally)。作为一种解决方法,我相信您可能想要定义一个辅助函数,如下所示:

function tryIt(fn, ...args) {
    try {
        return fn(...args);
    } catch {}
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

tryIt(function1, /* args if any */);
tryIt(function2, /* args if any */);
Run Code Online (Sandbox Code Playgroud)