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

时间:2011-04-23 12:15:55

标签: 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 { return func3(); } catch(e) {} // If func2 throws error, try func3
}

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

我放了an example on jsFiddle

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

11 个答案:

答案 0 :(得分:181)

没有 catch 子句的尝试将其错误发送到下一个更高的 catch 或窗口,如果没有定义的catch那试试。

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

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

答案 1 :(得分:19)

没有。你必须保留它们。

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

答案 2 :(得分:10)

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

但是,将它们清空是完全有效的,就像你的例子一样。

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

答案 3 :(得分:4)

我不推荐没有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

答案 4 :(得分:1)

他们用我知道的每种语言(JavaScript,Java,C#,C ++)一起使用。不要这样做。

答案 5 :(得分:1)

我决定从不同的角度来看问题。

我已经能够确定一种方法来允许密切关注所请求的代码模式,同时部分地解决另一位评论者列出的未处理的错误对象。

代码可见@ http://jsfiddle.net/Abyssoft/RC7Nw/4/

尝试:catch被放置在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], [], []));

答案 6 :(得分:1)

如果仅希望函数2和3在发生错误时触发,为什么不将它们放在catch块中?

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

答案 7 :(得分:0)

ES2019 开始,可能有一个空的catch块,没有错误变量。这称为optional catch binding,并在V8 v6.6, released in June 2018中实现。此功能自节点10 Chrome 66 开始提供。

语法如下所示:

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

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

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

答案 8 :(得分:0)

我相信您需要使用以下辅助功能:

for (i=1;i<children; i++)
        if ( (childpid = fork()) == 0 )
            break ;
        //printf("i: %d process ID: %d parent ID:%d child ID:%d\n",i, getpid(), getppid(), childpid);
    sleep(1); // bugarei xoris auto 

    switch(childpid){

    case -1:
        printf("Fork call failed!\n");
        break;

    case 0:
        //printf("i am child\n");
        child(fd[i]);
        break;

    default:
        //printf("i am parent\n");
        parent(fd,portNumber);
        break;

    }

并像这样使用它:

function tryIt(fn, ...args) {
    try {
        return fn(...args);
    } catch {}
}

答案 9 :(得分:-1)

尝试&amp;捕获就像一枚硬币的两面。所以没有尝试就不可能。

答案 10 :(得分:-1)

ES2019 起,您可以轻松使用try {}而不使用catch {}

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

有关更多信息,请转至Michael Ficcara's proposal