Javascript try..catch?

В Javascript согласно спецификации есть такая конструкция, как try..catch. Я достаточно давно пишу клиентскую часть на Javascript (но это не основной мой язык) и практически не видел, чтобы подобные блоки где-нибудь применялись на клиентской стороне. Вопрос — в каких случаях оправдано применение подобного блока и какие существуют возможные ограничения (связанные, например, с различием в реализации Javascript в разных браузерах)? Насколько сильно это нужно при написании серверного Javascript?
  • Вопрос задан
  • 11314 просмотров
Пригласить эксперта
Ответы на вопрос 9
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Если в JSON.parse подать невалидный JSON, то он выкинет исключение. Вот тут-то и понадобится try..catch.
Ответ написан
Комментировать
taliban
@taliban
php программист
Не слушайте глупости выше, в javascript как и в любом другом языке нужно использовать try… catch. От ошибок ниток не застрахован, а этот блок как минимум покажет пользователю что произошла неизвестная/такая-то ошибка. лично я часто использую try как возврат из методов/функций, ибо не всегда удобно делать цепочку ретурнов, а иногда возникают ситуации что дальнейшее продолжение не нужно.
тот же аякс да, это отличный пример, пришли неверные данные
его же можно использовать для своих ошибок в библиотеках (крупные популярные библиотеки его активно используют)
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
На клиентской части try/catch используются редко, потому ситуации с исключениями связаны с несуществующими методами/переменными/свойствами. Но если речь идет скажем о работе с файлами или еще чего такое, они могут быть полезны. Так же полезно

Я увы мало работал с серверным JS, но когда разбирался с ним, а точнее выбирал между Erlang и Node.js мне на глаза попалась статья о том, что все в Node.js надо оборачивать в try/catch. Это связано с тем, что если что-то упадет, а ситуации бывают разные, то упадет и весь сервер. А вам это точно радости не прибавит.
Ответ написан
Комментировать
norlin
@norlin
Имхо, любой try-catch (по крайней мере, в javascript) — это борьба со следствием, а не с причинами. Есть ошибка — надо ее исправить, а не скрывать от пользователя.
Есть асинхронный\файловый метод — надо равно обрабатывать и успешное выполнение и если что-то пошло не так.
Например, в node.js можно повесить событие на «непойманный эксепшн» — полезно в боевых условиях, когда сервер не должен падать, несмотря на ошибку.
Но это — лишь как средство тестирования. Т.е., попалась ошибка — записали в лог — увидели — исправили.
Ответ написан
mayhem
@mayhem
если вы используете в своих библиотеках для возвращения ошибки throw Error(«message»), то и try… catch придется :)
Ответ написан
Комментировать
Как в случае браузерного, так и в случае серверного Javascript конструкция try/catch используется для отлова исключений в синхронных операциях (пример: десериализация JSON-данных или валидация данных которые ввёл пользователь). Если требуется обрабатывать ошибки в асинхронных операциях, то ошибка либо передается в callback-функцию (В Node.js общепринятым шаблоном вызова callback-функции является вызов вида callback(err, results), где лишь один из аргументов может принимать значения отличные от null.), либо в более сложных случаях генерируется событие 'error' объекта класса EventEmitter.

В Node.js try/catch используется очень редко (в основном только при парсинге JSON-данных), это объясняется тем что большинство операций в Node.js асинхронны, как правило ошибку передают в callback-функцию или генерируют событие "error" у объекта класса EventEmitter.

Вот пример иллюстрирующий, что try/catch не отловит исключение возникшее при выполнении асинхронной операции:

function myApiFunc(callback)
{
  /*
   * Пример некорректного перехвата исключений
   * в асинхронных операциях
   */
  try {
    doSomeAsynchronousOperation(function (err) {
      if (err)
        throw (err);
    });
  } catch (ex) {
    callback(ex);
  }
}

Дело в том, что исключение бросается и, соответственно , должно ловиться в том контексте, в котором вызывается функция. В данном примере try/catch и вызов функции бросающей исключение выполнятся в разных контекстах в силу асинхронности функции doSomeAsynchronousOperation.
Ответ написан
Комментировать
ksdaemon
@ksdaemon
Согласен с первым комментарием: наиболее логичное место, где хочется использовать try/catch — это например оборачивать запросы через аякс на сервер, но в объекте XmlHttpRequest, да и не только — есть специальные методы типа onerror, в которых если надо можно реализовать обработку неверных ответов. Так что здесь использование try/catch теряет свой смысл. Так что, наверное, этот механизм можно использовать, если вы просто привыкли писать с использованием пользовательских исключений. То есть например проверка формы на валидность данных — проверяете, нашли ошибку, бросили сами исключение, сами его поймали и обработали.
Возможно имеет смысл использовать try/catch при попытках использовать какие-нибудь вещи, доступные в современных браузерах, а в случае их отсутствия делать fallback на что-то простое.
Ответ написан
@egorinsk
Я оборачивал в try/catch (естественно не руками) обработчики событий, вызовы setInterval/setTimeout, коллбеки, чтобы ловить ошибки и оггировать на сервер. Это, по моему, единственное применение, так как в нормальных условиях код не выбрасывает исключений (собственно, потому они и называются исключения).
Ответ написан
Комментировать
@dmsx
try catch можно использовать не только для отлова случайных багов связанных с кривизной рук разработчика, а так же отлова исключений там где мы не можем быть полностью уверены в том, что все будет ок в данном участке кода, но и как инструмент при проектировании сложных приложений, генерируя исключения самостоятельно и отлавливая их на разных уровнях.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы