В javascript есть условие для блока try-catch . В то время как в java или любом другом языке обязательно иметь обработку ошибок, я не вижу, чтобы кто-нибудь использовал их в javascript для большей степени. Разве это не хорошая практика или просто мы не нуждаемся в них в javascript?
69
While in java or *any other language* it is mandatory to have error handling...
- На самом деле, нет. Java, да, но есть много языков, которые не настаивают на try-catch (например, C #).Ответы:
Следует избегать
throw
ошибок как способа передачи условий ошибок в приложениях.throw
Заявление должно быть использовано только «Для этого не должно произойти, аварии и сжечь. Не восстанавливайте элегантно в любом случае»try catch
однако используется в ситуации, когда хост-объекты или ECMAScript могут выдавать ошибки.Пример:
В сообществе node.js рекомендуется, чтобы вы передавали ошибки в обратных вызовах (поскольку ошибки возникают только для асинхронных операций) в качестве первого аргумента.
Есть и другие проблемы, такие как try / catch очень дорого, уродливо и просто не работает с асинхронными операциями.
Так как синхронные операции не должны выдавать ошибку и не работают с асинхронными операциями, никто не использует try catch, кроме ошибок, генерируемых объектами хоста или ECMAScript
источник
Error
, но их мало и далеко.document.getElementById
, не выбрасывает, когда элемент не существует, он просто возвращаетnull
. То же самое можно сделать почти во всех случаяхTry / catch в Javascript не так пуленепробиваем, как в других языках, из-за асинхронной природы Javascript. Рассмотрим этот фрагмент:
Проблема заключается в том, что поток управления покидает
try
блок до того, какdo_something_that_throws()
будет выполнен, поэтому ошибка, генерируемая внутри обратного вызова, никогда не перехватывается.Так что try / catch в принципе неуместен во многих случаях, и не всегда очевидно, выполняет ли что-то код асинхронно или нет. К счастью, javascript с его особой идиомой однопоточного асинхронного обратного вызова и его поддержкой фактических замыканий предоставляет элегантную альтернативу: обработка ошибок в стиле продолжения передачи. Просто передайте правильный ответ на любую ошибку как функцию, например:
источник
Многие из этих ответов устарели
async
и не учитывают новые функции ES7 иawait
.Используя
async
/await
вы можете теперь получить асинхронный поток управления, как вы хотите:Узнайте больше о
async
/await
здесь . Вы можете использоватьasync
/await
сейчас, используя Babel .источник
try-catch в javascript так же действителен и полезен, как и в любом другом языке, который их реализует. Есть одна главная причина, по которой он не используется в javascript так часто, как в других языках. По той же причине javascript считается уродливым скриптовым языком, по той же причине, по которой люди думают, что программисты на javascript не являются настоящими программистами:
Сам факт того, что так много людей подвергаются воздействию javascript (благодаря тому, что браузеры поддерживают только поддерживаемый язык), означает, что у вас есть много непрофессионального кода. Конечно, есть также много незначительных причин:
catch
могут (асинхронные вещи)В любом случае, следует использовать try-catch , но, конечно, вы должны научиться правильно их использовать - как и все остальное в программировании.
источник
Я полагаю, что большая часть причины, которая
try..catch
редко встречается в JavaScript, заключается в том, что язык имеет довольно высокую устойчивость к ошибкам. Подавляющее большинство ситуаций может быть обработано с помощью проверок кода, правильных значений по умолчанию и асинхронных событий. В некоторых случаях простое использование шаблона предотвратит проблемы:Некоторые из основных проблем в других языках, которые вызывают исключения, просто не существуют в JS. В большинстве случаев кастинг не требуется. Вместо этого предпочтительным методом обычно является проверка функций (принудительное использование определенного интерфейса):
С добавлением
async
/await
к языкуtry..catch
становится все более распространенным. Обещания, являющиеся асинхронной формойtry..catch
, имеют смысл ожидать:вместо этого быть написано как:
источник
Возможно, еще одна причина, по которой try / catch не очень часто используется в Javascript, заключается в том, что конструкция не была доступна в самых первых версиях Javascript ... она была добавлена позже.
В результате некоторые старые браузеры не поддерживают его. (На самом деле, это может вызвать синтаксическую / синтаксическую ошибку в некоторых старых браузерах, что более сложно «защищать» от большинства других типов ошибок.)
Что еще более важно, поскольку он изначально не был доступен, встроенные функции Javascript, которые были первоначально выпущены (то, что на многих языках называлось бы «библиотечными» функциями), не используют его. (Он не очень хорошо «ловит» ошибку от someobject.somefunction (), если он не «выбрасывает», а вместо этого просто возвращает «ноль» при возникновении проблемы.)
Еще одной возможной причиной является то, что механизм try / catch изначально не казался необходимым (и все же он не кажется таким уж полезным). Это действительно необходимо, только когда вызовы обычно вложены в несколько уровней; простое возвращение какого-либо типа ERRNO прекрасно подойдет для прямых вызовов (хотя, чтобы сделать его действительно полезным, когда он доступен, в большинстве языков рекомендуется использовать его везде, а не только при глубоко вложенных вызовах). Поскольку изначально логика Javascript должна была быть небольшой и простой (в конце концов, это просто дополнение к веб-странице :-), не ожидалось, что вызовы функций будут глубоко вложенными, и поэтому механизм try / catch не кажется необходимым.
источник
Я полагаю, что они не используются так часто, потому что выбрасывание исключений в клиентском коде Javascript затрудняет отладку страницы.
Вместо того , чтобы бросать исключения, я обычно предпочитаю , чтобы показать окно предупреждения аль (то есть
alert("Error, invalid...");
)Это может показаться странным, но ошибки Javascript случаются на стороне клиента, если клиент использует созданную вами страницу, и страница выдает исключение, если только клиент не разбирается в технических знаниях, он никак не сможет сказать, Вы в чем проблема.
Он только позвонит вам и скажет: «Эй, страница X не работает!», И тогда вам остается только выяснить, что пошло не так и где в коде.
Используя вместо этого окно с предупреждением, более вероятно, что он звонит и говорит что-то вроде: «Эй, когда я нажимаю на кнопку A на странице X, появляется окно с надписью ...» , поверьте мне, это будет намного легче найти баг.
источник