попробовать {} без catch {} возможно в JavaScript? - PullRequest
84 голосов
/ 23 апреля 2011

У меня есть ряд функций, которые либо возвращают что-то, либо выдают ошибку. В основной функции я вызываю каждую из них и хотел бы вернуть значение, возвращаемое каждой функцией, или перейти ко второй функции, если первая функция вызывает ошибку.

Итак, в основном то, что у меня сейчас есть:

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

Ответы [ 10 ]

184 голосов
/ 23 апреля 2011

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

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

try {
    // whatever;
} finally {
    // always runs
}
19 голосов
/ 23 апреля 2011

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

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

10 голосов
/ 23 апреля 2011

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

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

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

4 голосов
/ 22 февраля 2018

Я бы не рекомендовал try-finally без перехвата, потому что, если и ошибка в блоке try, и в блоке finally, ошибка, выдаваемая в предложении 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
3 голосов
/ 01 июня 2019

Возможно иметь пустой блок catch без переменной ошибки, начиная с ES2019 .Это называется необязательное связывание перехвата и было реализовано в V8 v6.6, выпущенном в июне 2018 .Функция доступна с Узел 10 и Chrome 66 .

Синтаксис показан ниже:

try {
  throw new Error("This won't show anything");
} catch { };

Вам все еще нужен блок catch, но он может быть пустым и вам не нужно передавать какую-либо переменную.Если вам совсем не нужен блок catch, вы можете использовать try / finally, но имейте в виду, что он не будет глотать ошибки, как пустой тег.

try {
  throw new Error("This WILL get logged");
} finally {
  console.log("This syntax does not swallow errors");
}
1 голос
/ 09 ноября 2018

Если вы хотите, чтобы функции 2 и 3 срабатывали только при возникновении ошибки, почему вы не помещаете их в блок catch?

function testAll() {
  try {
    return func1();
  } catch(e) {
    try {
      return func2();
    } catch(e) {
      try {
        return func3();
      } catch(e) {
        // LOG EVERYTHING FAILED
      }
    }
  }
}
1 голос
/ 05 ноября 2012

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

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

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

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

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

1013 *

1 голос
/ 23 апреля 2011

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

0 голосов
/ 08 февраля 2019

Поскольку ES2019 , вы можете легко использовать try {} без catch {}:

try {
  parseResult = JSON.parse(potentiallyMalformedJSON);
} catch (unused) {}

Для получения дополнительной информации, пожалуйста, обращайтесь к предложению Майкла Фиккары

0 голосов
/ 23 апреля 2011

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

...