попробуйте {} без 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 блоки удалены при достижении того же эффекта?

681   7  

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

try & catch похожи на 2 стороны одной монеты. так что не возможно не попробовать.

Comments

    Ничего не найдено.