在JavaScript中尝试{}而不捕获{}可能吗?

在JavaScript中尝试{}而不捕获{}可能吗?,javascript,function,try-catch,return,Javascript,Function,Try Catch,Return,我有很多函数,它们要么返回某个东西,要么抛出一个错误。在一个main函数中,我调用其中的每一个函数,并希望返回每个函数返回的值,或者如果第一个函数抛出错误,则返回第二个函数 所以基本上我现在拥有的是: function testAll() { try { return func1(); } catch(e) {} try { return func2(); } catch(e) {} // If func1 throws error, try func2 try { re

我有很多函数,它们要么返回某个东西,要么抛出一个错误。在一个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
}
但实际上我只想
尝试
返回它(即,如果它没有抛出错误)。我不需要
catch
块。但是,像
try{}
这样的代码失败,因为它缺少一个(未使用的)
catch{}

我说


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

没有。你必须保留它们

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

不,
catch
(或
最终
)是
try
的朋友,并且始终是try/catch的一部分

但是,将它们设为空是完全有效的,如您的示例中所示


在示例代码中的注释中(如果func1抛出错误,请尝试func2),似乎您真正想要做的是调用上一个代码块的
catch
中的下一个函数。

它们以我所知道的每种语言(JavaScript、Java、C#、C++)组合在一起。不要这样做。

尝试和抓住就像一枚硬币的两面。因此,没有try是不可能的。

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

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


我决定从另一个角度来看待这个问题

我已经能够确定一种方法,在部分解决另一个评论者列出的未处理的错误对象时,可以密切考虑请求的代码模式

代码可以看到@

尝试:捕捉被放置在一个for循环中,允许优雅的落下。同时能够遍历所需的所有函数。当需要显式错误处理时,使用额外的函数数组。在错误和带有错误处理程序的函数数组元素不是函数的情况下,错误被转储到控制台

根据stackoverflow的要求,这里是内联代码[编辑以使JSLint兼容(删除前导空格以确认),提高可读性]

function func1() {"use strict"; throw "I don't return anything"; }
function func2() {"use strict"; return 123; }
function func3() {"use strict"; throw "I don't return anything"; }

// ctr = Code to Run <array>, values = values <array>, 
// eh = error code can be blank.
// ctr and params should match 1 <-> 1
// Data validation not done here simple POC
function testAll(ctr, values, eh) {
    "use strict";
    var cb; // cb = code block counter
    for (cb in ctr) {
        if (ctr.hasOwnProperty(cb)) {
            try {
                return ctr[cb](values[cb]);
            } catch (e) {
                if (typeof eh[cb] === "function") {
                    eh[cb](e);
                } else {
                    //error intentionally/accidentially ignored
                    console.log(e);
                }
            }
        }
    }
    return false;
}

window.alert(testAll([func1, func2, func3], [], []));
函数func1(){“使用严格”抛出“我不返回任何内容”}
函数func2(){“use strict”;返回123;}
函数func3(){“使用严格”抛出“我不返回任何内容”}
//ctr=要运行的代码,值=值,
//eh=错误代码可以为空。
//ctr和参数应匹配1
//数据验证不是在这里完成的简单POC
功能测试(ctr、值、eh){
“严格使用”;
var cb;//cb=代码块计数器
用于(中央控制室中的cb){
if(中心hasOwnProperty(cb)){
试一试{
返回ctr[cb](值[cb]);
}捕获(e){
if(eh[cb]=“功能”的类型){
eh[cb](e);
}否则{
//故意/意外忽略的错误
控制台日志(e);
}
}
}
}
返回false;
}
警报(测试集([func1,func2,func3],],[]);

我不建议在没有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');
}
结果:

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

如果您只想在发生错误时触发函数2和3,为什么不将它们放在catch块中

function testAll() {
  try {
    return func1();
  } catch(e) {
    try {
      return func2();
    } catch(e) {
      try {
        return func3();
      } catch(e) {
        // LOG EVERYTHING FAILED
      }
    }
  }
}

由于ES2019您可以轻松使用
try{}
而无需
catch{}

try {
  parseResult = JSON.parse(potentiallyMalformedJSON);
} catch (unused) {}

有关更多信息,请参考

可以有一个空的catch块,没有错误变量,从ES2019开始。这被称为,并在中实现。自节点10、Firefox 58、Opera 53和Safari 11.1以来,该功能一直可用

语法如下所示:

试试看{
抛出新错误(“这不会显示任何内容”);

}捕获{}我认为您需要使用帮助器函数,如:

function tryIt(fn, ...args) {
    try {
        return fn(...args);
    } catch {}
}
然后像这样使用它:

tryIt(function1, /* args if any */);
tryIt(function2, /* args if any */);

…有没有办法在达到相同效果的同时移除这些捕捉块?
看起来没有;Javascript要求try块后跟catch或finally块

话虽如此,有一种方法可以使用这些捕捉块来实现您想要的效果

//如果func1抛出错误,请尝试func2
如果抛出错误,则catch块就是用于此条件的

既然它们的用途正是你想要的,为什么要把它们去掉呢

try { return func1(); }
catch {
   // if func1 throws error
   try { return func2(); } 
   catch {
      // if func2 throws error
      try { return func3(); } 
      catch {
         // if func3 throws error
      }
   }
}

我完全理解为什么您可能不需要一个catch块,并且会发现完全省略它会更干净。但我认为这不是那种情况。

你说得对。但是,如果像
这样的代码,请尝试{…};try{…}
如果可能的话,代码的含义可能会更清楚(尝试第一个,否则尝试第二个)。关于您的编辑:在JSFiddle示例中,第二个函数返回一些东西,那么在这种情况下第三个函数真的会被计算吗?我以为
return
语句会阻止后面的任何内容。@pimvdb对不起,我没有检查小提琴<代码>返回
将导致函数过早返回。我会更新我的答案。这个答案事实上是不正确的,你可以让
试试{};最后{}
如@DanielXMoore中所示,确实如此,但最后{}
基本上与
捕获{}
的精神相同。我将更新答案。在这种情况下,这些函数不应该抛出错误,而应该返回,例如
null
,您可以执行类似
return func1()| | func2()| func3()的操作try { return func1(); }
catch {
   // if func1 throws error
   try { return func2(); } 
   catch {
      // if func2 throws error
      try { return func3(); } 
      catch {
         // if func3 throws error
      }
   }
}