在JavaScript中尝试{}而不捕获{}可能吗?
我有很多函数,它们要么返回某个东西,要么抛出一个错误。在一个main函数中,我调用其中的每一个函数,并希望返回每个函数返回的值,或者如果第一个函数抛出错误,则返回第二个函数 所以基本上我现在拥有的是:在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
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
}
}
}