Ответ 1
Нет. Вы должны держать их.
Это действительно имеет смысл, поскольку ошибки не следует игнорировать вообще.
У меня есть ряд функций, которые либо возвращают что-то, либо бросают ошибку. В основной функции я вызываю каждый из них и хотел бы вернуть значение, возвращаемое каждой функцией, или перейти ко второй функции, если первые функции вызывают ошибку.
Итак, в основном у меня есть:
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
при достижении того же эффекта?
Нет. Вы должны держать их.
Это действительно имеет смысл, поскольку ошибки не следует игнорировать вообще.
Пробовать без предложения catch отправляет свою ошибку на следующий более высокий catch или в окно, если в этой попытке нет catch.
Если у вас нет catch, выражение try требует предложения finally.
try {
// whatever;
} finally {
// always runs
}
Нет, catch
(или finally
) является try
friend и всегда присутствует как часть try/catch.
Однако, совершенно верно, что они пусты, как в вашем примере.
В комментариях в вашем примере кода (Если func1 выбрасывает ошибку, попробуйте func2), казалось бы, что вы действительно хотите сделать, это вызвать следующую функцию внутри блока catch
предыдущего.
Они объединяются на каждом языке, который я знаю, который имеет их (JavaScript, Java, С#, С++). Не делайте этого.
Я решил посмотреть на проблему, представленную под другим углом.
Я смог определить способ, позволяющий тщательно использовать шаблон кода, запрошенный, в то время как частично обращается к не обработанному объекту ошибки, указанному другим комментатором.
можно увидеть код @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], [], []));
попробуйте и поймайте, как 2 стороны одной монеты. поэтому невозможно без попытки.