在JavaScript中尝试{}而不是catch {}?
我有一些函数返回的东西或抛出一个错误。 在一个主函数中,我调用其中的每一个函数,并且想要返回每个函数返回的值,或者如果第一个函数抛出错误,则继续执行第二个函数。
所以基本上我现在拥有的是:
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 {}
这样的代码会失败,因为它缺less一个(未使用的) catch {}
块。
我把例子放在jsFiddle上 。
那么,有没有办法去除那些catch
块,同时达到相同的效果?
不,你必须保留他们。
这实际上是有道理的,因为错误不应该被默默地忽略。
没有catch子句的try将错误发送到下一个较高的catch或window,如果在try中没有定义catch。
如果你没有捕获 ,try语句需要finally子句。
try { // whatever; } finally { // always runs }
不, catch
(或finally
)是try
的朋友,总是作为尝试/捕捉的一部分。
然而,像你的例子那样,让它们变空是完全有效的。
在你的示例代码中的注释( 如果func1抛出错误,尝试func2 ),看起来你真正想要做的是调用在前面的catch
块内的下一个函数。
他们一起使用我知道的每种语言(JavaScript,Java,C#,C ++)。 不要这样做。
我决定从另一个angular度来看问题。
我已经能够确定一种方法来严格地允许请求的代码模式,同时部分地处理由另一个评论者列出的未处理的错误对象。
代码可以看到@ http://jsfiddle.net/Abyssoft/RC7Nw/4/
尝试:catch放在一个for循环允许优美的下降通过。 同时能够遍历所有需要的function。 当需要显式的error handling时,使用额外的函数数组。 在具有error handling程序元素的错误和函数数组中不是函数,错误被转储到控制台。
这里的每一个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], [], []));
试一试就像一枚硬币的两面。 所以不可能没有尝试。