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 {}块.
那么,是否有任何方法可以catch在实现相同效果的同时移除这些块?
ken*_*bec 206
一个 尝试没有赶上条款将其错误到下一个更高的渔获,或窗口,如果没有试图内定义的渔获物.
如果没有catch,try表达式需要finally子句.
try {
// whatever;
} finally {
// always runs
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*scu 16
从ES2019开始,可能有一个空的catch块,没有错误变量。这称为可选的catch绑定,已在2018年6月发布的V8 v6.6中实现。该功能自Node 10,Chrome 66,Firefox 58,Opera 53和Safari 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)
Thi*_*ter 12
不,你必须保留它们.
这实际上是有道理的,因为根本不应该忽略错误.
ale*_*lex 10
不,catch(或finally)是try朋友,并始终作为try/catch的一部分.
但是,将它们清空是完全有效的,就像在您的示例中一样.
在示例代码的注释中(如果func1抛出错误,请尝试func2),看起来你真正想要做的就是调用前一个catch块内的下一个函数.
我不建议不带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)
不,不可能有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)