попробуйте {} без catch {} возможно в JavaScript?
у меня есть ряд функций, которые либо что-то возвращать или выдавать ошибку. В основной функции я вызываю каждый из них и хотел бы вернуть значение, возвращаемое каждой функцией, или перейти ко второй функции, если первая функция выдает ошибку.
так что в основном то, что у меня сейчас есть:
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 {} блок.
Я поставил пример на jsFiddle.
Итак, есть ли способ, чтобы эти catch блоки удалены при достижении того же эффекта?
7 ответов:
нет. Вы должны их сохранить.
Это действительно имеет смысл, так как ошибки не должны молча игнорироваться вообще.
A попробовать без лови предложение отправляет свою ошибку следующему выше лови, или окно, если нет никакого улова, определенного в этой попытке.
Если у вас нет лови, выражение try требует наконец-то предложения.
try { // whatever; } finally { // always runs }
Неа,
catch(илиfinally) составляетtryдруг и всегда там как часть try / catch.тем не менее, вполне допустимо иметь их пустыми, как в вашем примере.
в комментариях в вашем примере код (если func1 выдает ошибку, попробуйте func2), казалось бы, что вы действительно хотите сделать, это вызвать следующую функцию внутри
catchблок предыдущего.
Они идут вместе на каждом языке, который я знаю, что имеет их (JavaScript, Java, C#, C++). Не делай этого.
Я решил взглянуть на проблему, представленную под другим углом.
я смог определить способ, чтобы разрешить близко для шаблона кода, запрошенного при частичном обращении к необработанному объекту ошибки, перечисленному другим комментатором.
код можно увидеть @ http://jsfiddle.net/Abyssoft/RC7Nw/4/
try: catch помещается в петлю for, позволяющую изящно провалиться. будучи в состоянии перебирать все функции необходимый. при необходимости явной обработки ошибок используется дополнительный массив функций. в even of error и функциональном массиве с обработчиками ошибок элемент не является функцией, ошибка сбрасывается на консоль.
в соответствии с требованиями stackoverflow вот код inline [отредактирован, чтобы сделать 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], [], []));
Я бы не рекомендовал try-finally без catch, потому что, если оба блока try и, наконец, ошибки броска блока, ошибка, брошенная в предложении 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
Comments