Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Нет. Вы должны держать их.

Это действительно имеет смысл, поскольку ошибки не следует игнорировать вообще.

Ответ 2

Пробовать без предложения catch отправляет свою ошибку на следующий более высокий catch или в окно, если в этой попытке нет catch.

Если у вас нет catch, выражение try требует предложения finally.

try {
    // whatever;
} finally {
    // always runs
}

Ответ 3

Нет, catch (или finally) является try friend и всегда присутствует как часть try/catch.

Однако, совершенно верно, что они пусты, как в вашем примере.

В комментариях в вашем примере кода (Если func1 выбрасывает ошибку, попробуйте func2), казалось бы, что вы действительно хотите сделать, это вызвать следующую функцию внутри блока catch предыдущего.

Ответ 4

Они объединяются на каждом языке, который я знаю, который имеет их (JavaScript, Java, С#, С++). Не делайте этого.

Ответ 5

Я решил посмотреть на проблему, представленную под другим углом.

Я смог определить способ, позволяющий тщательно использовать шаблон кода, запрошенный, в то время как частично обращается к не обработанному объекту ошибки, указанному другим комментатором.

можно увидеть код @http://jsfiddle.net/Abyssoft/RC7Nw/4/

try: catch помещается внутри цикла for, что позволяет грациозно проваливаться. будучи в состоянии выполнять итерацию всех необходимых функций. когда требуется явная обработка ошибок, используется дополнительный массив функций. в четном случае ошибка и функциональный массив с элементом обработчиков ошибок не является функцией, ошибка сбрасывается на консоль.

В соответствии с требованиями 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], [], []));

Ответ 6

попробуйте и поймайте, как 2 стороны одной монеты. поэтому невозможно без попытки.