我有许多函数可以返回某些内容或抛出错误。在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 {}
块。
那么,有没有办法让这些catch
块被移除,同时达到同样的效果?
答案 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