У меня есть несколько функций, которые либо что-то возвращают, либо выдают ошибку. В основной функции я вызываю каждую из них и хотел бы вернуть значение, возвращаемое каждой функцией, или перейти ко второй функции, если первые функции вызывают ошибку.
Итак, в основном то, что у меня сейчас есть:
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
удалить эти блоки при достижении того же эффекта?
javascript
function
try-catch
return
pimvdb
источник
источник
null
return func1() || func2() || func3();
try {}; finally {}
как показано в stackoverflow.com/a/5764505/68210catch (e) {}
исключения, выброшенное исключениеfunc1()
предотвратило бы попыткуfunc2()
.async
функции. Ясно, что язык javascript заставляет создавать пустыеcatch
блоки бессмысленно.Попытка без улова пункта отправляет сообщение об ошибке на следующий более высокий улов , или в окно, если нет никакого подвоха определяется в пределах этой попытки.
Если у вас нет ловушки , выражение try требует предложения finally .
источник
try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { //always run}}}
?Начиная с ES2019 , можно иметь пустой блок catch без переменной ошибки . Это называется необязательной привязкой перехвата и было реализовано в V8 v6.6, выпущенном в июне 2018 года . Эта функция доступна с Node 10 , Chrome 66 , Firefox 58 , Opera 53 и Safari 11.1 .
Синтаксис показан ниже:
Вам все еще нужен
catch
блок, но он может быть пустым, и вам не нужно передавать никакую переменную. Если вам вообще не нужен блок catch, вы можете использоватьtry
/finally
, но учтите, что он не принимает ошибок, как это делает пустой catch.источник
try
блокировать. 2. Ловит ошибку. 3. Выполняетfinally
блок. 4. Выдает ошибку. Это верно?catch
). Окружите весь код другимtry
/,catch
и вы сможете пойматьThis WILL get logged
ошибку.Нет,
catch
(orfinally
) -try
друг пользователя и всегда рядом в рамках try / catch .Однако вполне допустимо, чтобы они были пустыми, как в вашем примере.
В комментариях к вашему примеру кода ( если func1 выдает ошибку, попробуйте func2 ), может показаться, что вы действительно хотите вызвать следующую функцию внутри
catch
блока предыдущего.источник
try {...}; try {...}
возможен, смысл кода может быть более ясным (попробуйте первое, в противном случае попробуйте второе).return
заявление останавливает все, что идет после него.return
вызовет преждевременный возврат функции. Я обновлю свой ответ.try {}; finally {}
как показано в stackoverflow.com/a/5764505/68210finally{}
в основном в том же духе, что иcatch{}
. Обновлю ответ.Я бы не рекомендовал try-finally без улова, потому что, если и блок try, и блок finally блокируют ошибки throw, ошибка, выданная в предложении finally, всплывает, а ошибка блока try игнорируется в моем собственном тесте:
Результат:
источник
Они работают вместе на всех известных мне языках, где они есть (JavaScript, Java, C #, C ++). Не делай этого.
источник
catch {my code}
Я решил взглянуть на поставленную проблему под другим углом.
Мне удалось определить способ, позволяющий внимательно учесть запрошенный шаблон кода, частично обращаясь к необработанному объекту ошибки, указанному другим комментатором.
код можно увидеть на http://jsfiddle.net/Abyssoft/RC7Nw/4/
try: catch помещается в цикл for, позволяющий изящно проваливаться. имея возможность перебирать все необходимые функции. когда требуется явная обработка ошибок, используется дополнительный массив функций. в четности ошибок и функционального массива с обработчиками ошибок элемент не является функцией, ошибка выгружается в консоль.
В соответствии с требованиями stackoverflow, здесь есть встроенный код [отредактирован, чтобы сделать JSLint совместимым (удалить ведущие пробелы для подтверждения), улучшить читаемость]
Взаимодействие с другими людьми
источник
Если вы хотите, чтобы при возникновении ошибки срабатывали только функции 2 и 3, почему вы не помещаете их в блок catch?
источник
Я считаю, что вам нужно использовать вспомогательную функцию, например:
и используйте его как:
источник
Попробуй и поймай - это две стороны одной медали. так что невозможно без попытки.
источник
try {}; finally {}
как показано в stackoverflow.com/a/5764505/68210Начиная с ES2019 вы можете легко использовать
try {}
безcatch {}
:Для получения дополнительной информации, пожалуйста, обратитесь к предложению Майкла Фиккара.
источник
catch
по-прежнему требуется, просто привязка не требуется ...