Ошибки в JavaScript: исправляем, обрабатываем, чиним
Всем привет! Вдохновленные успехом предыдущей статьи, которая была написана в преддверии запуска курса «Fullstack разработчик JavaScript«, мы решили продолжить серию статей для новичков и всех тех, кто только начинает заниматься программированием на языке JavaScript. Cегодня мы поговорим об ошибках, которые случаются в JS, а также о том, как именно с ними бороться.
Отдебажь за человека одну ошибку, и он будет благодарен тебе один пулл реквест. Научи его дебажить самостоятельно, и он будет благодарен тебе весь проект.
Типичные ошибки начинающих
Итак, начнем с самых примитивных ошибок. Допустим, вы только недавно закончили изучать основы HTML и CSS и теперь активно принялись за программирование на JavaScript. Для примера: вы хотите, чтобы при клике на кнопку у вас открывалось, к примеру, скрытое до этого момента модальное окно. Так же вы хотите, чтобы у вас по нажатию на крестик это окно закрывалось. Интерактивный пример доступен здесь (я выбрал bitbucket из-за того, что его интерфейс мне кажется самым простым, да и не все же на гитхабе сидеть).
В нашем index.html, кроме верстки, мы внутри тэга head вставляем наш script:
В index.html кроме верстки внутри тэга head мы вставляем наш script :
Однако, несмотря на то, что мы все подключили, ничего не заработает и вылетит ошибка:
Что весьма печально, новички часто теряются и не понимают, что делать с красными строчками, словно это приговор какой-то, а не подсказка о том, что не так в вашей программе. Если перевести, то браузер говорит нам, что он не может прочитать свойство addEventListener нулевого значения. Значит, почему-то из DOM модели мы не получили наш элемент. Какой алгоритм действий нужно предпринять?
Во-первых, посмотрите в какой момент у вас вызывается javascript . Браузер читает ваш html-код сверху вниз, как вы читаете, например, книгу. Когда он увидит тэг script , то сразу исполнит его содержимое и продолжит чтение следующих элементов, не особо заботясь о том, что в своем скрипте вы пытаетесь получить элементы DOM, а он их еще не прочитал и, следовательно, не построил модель.
Что делать в таком случае? Просто добавьте атрибут defer внутрь вашего тэга скрипт (или async , но я не буду сейчас вдаваться в подробности их работы, это можно прочитать здесь ). Или можете просто переместить вниз ваш тэг script перед закрывающим body , это тоже сработает.
Во-вторых, проверьте опечатки. Изучите методологию БЭМ — она полезна ещё и тем, что вы хорошо знаете, как пишется ваш элемент — ведь пишите классы по единой логике, и стараетесь пользоваться только правильным английским языком. Или копируете сразу название элемента в JS файл.
Отлично. Теперь, когда вы поправили ошибки, можете насладиться рабочей версией кода по следующему адресу.
Загадочная ошибка
Больше всего новичков вводит в ступор странная ошибка последней строчки кода. Приведем пример:
В консоли выводится что-то непонятное. Если переводить, то буквально это «Неожиданный конец ввода» — и что с этим делать? Кроме того, новичок по привычке смотрит на номер строки. На ней вроде все нормально. И почему тогда консоль на нее указывает?
Все просто. Что бы понимать, как интерпретировать вашу программу, интерпретатору JS нужно знать, где заканчивается тело функции, и где заканчивается тело цикла. В данном варианте кода я абсолютно намеренно забыл последнюю фигурную скобку:
Теперь JavaScript не понимает, где у него конец тела функции, а где конец цикла и не может интерпретировать код.
Что делать в данном случае? В любом современном редакторе кода, если вы поставите курсор перед открывающей скобкой, подсветится его закрывающий вариант (если редактор еще не начал подчеркивать эту ошибку красным цветом). Просмотрите код еще раз внимательно, держа в голове, что в JS не бывает одиноких фигурных скобок. Проблемный вариант можно посмотреть здесь, а исправленный — вот тут.
Дробим код
Чаще всего стоит заниматься написанием кода, тестируя его работу небольшими кусочками. Или как нормальный человек изучить TDD К примеру, вам нужно простую программу, которая принимает данные на вход от пользователя, складывает их в массив и после этого выводит их средние значения:
На первый неискушенный взгляд, в данном коде вполне все нормально. В нем есть основная логика, раздробленная на две функции, каждую из которой можно применять потом отдельно. Однако опытный программист сразу скажет, что это не заработает, ведь из prompt данные к нам приходят в виде строки. Причем JS (таков его толерантно-пофигистичный характер) нам все запустит, но на выходе выдаст настолько невероятную чепуху, что даже будет непросто понять, как мы дошли до жизни такой. Итак, давайте попробуем что-нибудь посчитать в нашем интерактивном примере. Введем допустим число 3 в количество переменных, и 1 2 3 в поле ввода данных:
Что? Чего? Ладно, это JavaScript. Поговорим лучше, как мы могли бы избежать такого странного вывода. Надо было писать на Python, он бы по-человечески предупредил нас об ошибке. Нам надо было после каждого подозрительного момента сделать вывод типа переменных и смотреть, в каком состоянии находится наш массив.
Вариант кода, в котором вероятность неожиданного вывода снижена:
Иными словами, все подозрительные места, в которых что-то могло пойти не так, я вывел в консоль, чтобы убедиться, что все идет так, как я ожидаю. Конечно, данные console.log — детские игрушки и в норме, естественно, нужно изучить любую приличную библиотеку для тестирования. Например эту. Результат этой отладочной программы можно увидеть в инструментах разработчика здесь. Как починить, я думаю, вопросов не будет, но если если интересно, то вот (и да, это можно сделать просто двумя плюсами).
Шаг вперед: осваиваем Chrome Dev Tools
Дебаг с использованием console.log в 2019 — это уже несколько архаичная штука (но мы все равно ее никогда ее не забудем, она уже нам как родная). Каждый разработчик, который мечтает носить гордое звание профессионала, должен освоить богатый инструментарий современных средств разработки.
Попробуем починить проблемные места в нашем коде с помощью Dev Tools. Если нужна документация с примерами, всё можно прочитать вот здесь. А мы попробуем разобрать предыдущий пример с помощью Dev Tools.
Итак, открываем пример. У нас явно запрятался какой-то баг в коде, но как понять, в какой момент JavaScript начал что-то неправильно считать? Правильно, оборачиваем эту радость тестами на тип переменной, это же очень просто Идем во вкладку Sources в инструментах разработчика. Откройте файл code.js . У вас будут 3 части: первая слева, в которой отображается список файлов и вторая — в которой у нас отображается код. Но больше всего информации мы сможете почерпнуть из третьей части снизу, в которой отображается ход выполнения нашего кода. Давайте поставим breakpoint на 15 строчке (для этого надо щелкнуть по номеру строки в окне, где у нас отображается код, после чего у вас появится голубая метка). Перезапустите страницу, и введите любые значения в нашу программу.
Теперь вы можете вытащить из нижней панели debug массу полезной информации. Вы обнаружите, что JS не особенно задумываясь над типом переменных ведь статистические языки тупо лучше и нужно писать только на них, чтобы получать предсказуемо работающие и быстрые программы складывает переменные в виде строки в наш массив. Теперь, осознав картину происходящего, мы можем принять контрмеры.
Учимся перехватывать ошибки
Конструкция try… catch встречается во всех современных языках программирования. Зачем эта синтаксическая конструкция нужна практически? Дело в том, что при возникновении ошибки в коде, он останавливает свое выполнение на месте ошибки — и все, дальнейшие инструкции интерпретатор не исполнит. В реально работающем приложении, из нескольких сотен строчек кода, нас это не устроит. И предположим, что мы хотим перехватить код ошибки, передать разработчику ее код, и продолжить выполнение дальше.
Наша статья была бы неполной без краткого описания основных типов ошибки в JavaScript:
- Error — общий конструктор объекта ошибки.
- EvalError — тип ошибки, появляющийся во время ошибок исполнения eval() , но не синтаксических, а при неправильном использовании этой глобальной функции.
- RangeError — происходит, когда вы выходите за пределы допустимого диапазона в исполнении вашего кода.
- ReferenceError — происходит, когда вы пытаетесь вызвать переменную, функцию или объект, которых нет в программе.
- SyntaxError — ошибка в синтаксисе.
- TypeError — происходит при попытке создания объекта с неизвестным типом переменной или при попытке вызова несуществующего метода
- URIError — редко встречающий код, который возникает при неправильном использовании методов encodeURL и DecodeURL.
Здорово, давайте теперь немного попрактикуемся и посмотрим на практике, где мы можем использовать конструкцию try… catch. Сам принцип работы данной конструкции совсем простой — интерпретатор пытается исполнить код внутри try , если получается — то все продолжается, словно этой конструкции никогда не было. А вот если произошла ошибка — мы ее перехватываем и можем обработать, к примеру, сказав пользователю, где именно он допустил промах.
Давайте создадим самый простой калькулятор (даже калькулятором его называть громко, я бы сказал:«исполнитель введенных выражений»). Его интерактивный пример можно найти здесь. Хорошо, давайте теперь посмотрим на наш код:
Если вы попробуете ввести корректное математическое выражение, то все сработает нормально. Однако попробуйте ввести некорректное выражение, к примеру, просто строку, тогда программа выведет пользователю соответствующее предупреждение.
Надеюсь, вы прочитаете еще статьи, в которых объясняются другие части перехвата ошибок, такие например, как эта , чтобы расширить свое понимание в отладке программ, и изучите другие синтаксические конструкции, такие как finally , а также генерацию своих собственных ошибок.
На этом все. Надеюсь, эта статья оказалась полезна и теперь, при отладке приложений, вы будете чувствовать себя более уверенно. Мы разобрали типичные ошибки от самых элементарных, которые делают новички программирующие на JS всего несколько дней, до техники перехвата ошибок, которые применяют более продвинутые разработчики.
Ошибка «JavaScript error occurred in the main process»: причины появления и способы устранения
Появление кода этого программного сбоя свидетельствует о завершении рабочего сеанса голосового мессенджера. Это довольно распространенная ошибка, с которой часто сталкиваются пользователи операционной системы Windows. Появление фразы «JavaScript error occurred in the main process» можно расценивать в качестве оповещения о некорректной работе программного обеспечения или конкретных системных служб. Этот сбой можно устранить самостоятельно. Придерживайтесь экспертных рекомендаций и инструкций, чтобы сделать все правильно.
Скриншот ошибки JavaScript
Причины появления ошибки
В коде программного сбоя всегда зашифрована причина возникновения ошибки. В данном случае оповещение свидетельствует о некорректной работе определенных сценариев JavaScript. Почему ошибка появляется именно при работе с Discord? Это обусловлено тем, что мессенджер создан на основе языка программирования Java.
Появление сбоя может также стать следствием повреждения системных файлов софта. Возможно, важные файлы были случайно удалены пользователем или заблокированы антивирусом, поэтому мессенджер Discord не работает. Практика показывает, что зачастую появление ошибки связано с отсутствием файла под названием «discord_voice». Впрочем, есть и другие причины:
- мессенджер конфликтует с программным обеспечением, которое было установлено на ноутбук или ПК;
- деинсталляция прежней версии Discord была выполнена некорректно. Остатки некоторых файлов создают проблемы в работе;
- не установлены компоненты операционной системы Windows последней версии, нужно включить автоматическую инсталляцию обновлений;
- некорректная работа мессенджера спровоцирована вирусами или шпионским ПО.
Ошибка работы приложения Дискорд
Чтобы точно определить причину, нужно провести тщательную диагностику.
Решение проблемы
Для устранения ошибки, откройте корневую директорию мессенджера. Найдите директории с названием «AppData» и «AppDataLocal». Из-за стандартных настроек ОС они могут быть недоступны для просмотра. Чтобы получить доступ к данным папкам, сделайте следующее:
- Зайдите в меню «Пуск» или воспользуйтесь комбинацией горячих клавиш «Win+R».
- Нажмите на «Выполнить».
Этих действий достаточно для решения проблемы и восстановления корректной работы программного обеспечения.
Альтернативные варианты устранения ошибки
Ранее было отмечено, что стать катализатором появления программного сбоя способны также стать вирусы. Для исключения этой вероятности, проверьте корневую директорию мессенджера Discord. Сначала закройте данную программу через «Диспетчер задач», а уже потом запускайте антивирус. Если зараженные файлы были обнаружены, удалите их, а потом повторно запустите голосовой чат. Во избежание появления дополнительных сбоев, всегда запускайте мессенджер от имени администратора.
Установите на PC или лэптоп актуальную версию ОС Windows, на которую регулярно выходят официальные обновления Microsoft. Сегодня разработчики американской компании исправно обновляют только восьмерку и десятку. Поэтому выберите одну из этих операционок. Голосовой чат Discord – это относительно новое программное обеспечение, использующее современные службы и компоненты. Старые версии операционной системы не поддерживают их, поэтому возникают всевозможные сбои и ошибки.
Проблемы с запуском Skype
У некоторых пользователей ошибка «Javascript error occurred in the main process» возникает при запуске программы Skype. Появление сбоя обусловлено тем, что операционная система пытается выполнить автозагрузку приложения, то есть открыть программу сразу после включения ноутбука или компьютера.
Автоматический запуск Skype предусматривает дополнительное взаимодействие с Javascript, что неудивительно, ведь рассматриваемая программа написана именно на этом языке программирования. В коде сбоя указан проблемный сценарий, который следует устранить для восстановления корректной работы системы.
Довольно часто советы по устранению ошибки сводятся к обновлению Java и сбросу пользовательских настроек браузера Internet Explorer. Однако все эти действия не помогут избавиться от сбоя. Решение проблемы лежит на поверхности. Запустите Skype и перейдите в раздел настроек. На вкладке общие вы найдете команду «Запускать Скайп автоматически». Отключите эту функцию.
Отключение автозагрузки в Скайпе
Ошибка исчезнет, но программа не будет включаться при запуске компьютера. Если автозагрузку Скайпа нужно сохранить, тогда зайдите в меню «Пуск». Перенесите иконку Skype в директорию Автозагрузка. Сделать это можно просто перетянув ярлык в нужную папку.
Заключение
Теперь вы знаете, как исправить ошибку «JavaScript error occurred in the main process» и почему этот программный сбой появляется. В целях профилактики старайтесь своевременно обновлять операционную систему, а также весь софт. Это позволит избежать возникновения различных ошибок.
Исправлено: ошибка JavaScript произошла в основном процессе
Вы перегружены раздражающими препятствиями при установке Discord, особенно с особо раздражающими Ошибка JavaScript? Вы не одиноки, но не беспокойтесь, потому что у нас есть решение для установки и запуска Discord в кратчайшие сроки. Вот как исправить ошибку JavaScript на Discord.
Сообщение об ошибке содержит:
«Ошибка Javascript в основном процессе»
Discord постоянно хранит временные данные на ПК, что помогает ему нормально функционировать, или в нашем случае происходят ошибки. Чтобы позволить Discord запускаться без ошибок Javascript или других проблем, мы должны удалить эти файлы. Следуйте инструкциям ниже.
Апрельское обновление 2020:
Теперь мы рекомендуем использовать этот инструмент для вашей ошибки. Кроме того, этот инструмент исправляет распространенные компьютерные ошибки, защищает вас от потери файлов, вредоносных программ, сбоев оборудования и оптимизирует ваш компьютер для максимальной производительности. Вы можете быстро исправить проблемы с вашим ПК и предотвратить появление других программ с этим программным обеспечением:
- Шаг 1: просмотреть PC Repair & Optimizer Tool (Windows 10, 8, 7, XP, Vista — Microsoft Gold Certified).
- Шаг 2: Нажмите «Начать сканирование”, Чтобы найти проблемы реестра Windows, которые могут вызывать проблемы с ПК.
- Шаг 3: Нажмите «Починить все», Чтобы исправить все проблемы.
Удалите папки на диске в% AppData% и% LocalAppData%.
- Для начала закройте Discord с помощью диспетчера задач (щелкните правой кнопкой мыши на панели задач и выберите «Диспетчер задач», затем выберите процесс Discord и нажмите «Выйти из задачи»).
- Затем щелкните правой кнопкой мыши значок меню «Пуск» в левом нижнем углу рабочего стола.
- Выберите Run из всплывающего меню, которое появляется.
- В маленьком окне «Выполнить» слева внизу введите% appdata% в пустое поле и нажмите кнопку «Выполнить» внизу.
- В открывшемся окне проводника Windows найдите папку Discord. Щелкните правой кнопкой мыши папку и выберите «Удалить» в контекстном списке.
- Вернитесь в меню «Пуск» и перезагрузите «Выполнить».
- Введите «% localappdata%» в поле и нажмите «Выполнить».
- Найдите папку «Диск» и удалите ее, как описано выше, щелкнув по ней правой кнопкой мыши и выбрав «Удалить».
- Перезапустите файл конфигурации Discord и следуйте инструкциям мастера установки.
В некоторых случаях эти дополнительные меры могут быть необходимы.
Установите приложение Discord (% LocalAppData% / Discord / Datest текущей версии) в качестве администратора и установите совместимость с Windows 7 или 8 (попробуйте оба варианта).
Убедитесь, что все экземпляры Discord, включая версию браузера, закрыты перед выполнением действий.
Вот несколько дополнительных решений:
- Из AppData Local MongoDBCompass app-1.13.1 Resources удалите файл с именем app.asar, прежде чем копировать его в любое место (в моем случае это был рабочий стол). Затем вставьте файл app.asar в этот путь AppData Local MongoDBCompass appappapp-1.13.1 Resources и повторите Compass.
- Перезагрузите Windows и попробуйте снова запустить Compass.
- Если ничего не помогает, переустановите приложение (например, другую версию).
Измените тип запуска высококачественной службы Windows Audio V >
Изменение типа запуска службы качества Windows Audio Video Experience с Ручного на Автоматический исправило ошибку JavaScript для многих пользователей. Они также сообщили, что метод был успешным в исправлении ошибки JavaScript для приложений, отличных от Discord!
CCNA, веб-разработчик, ПК для устранения неполадок
Я компьютерный энтузиаст и практикующий ИТ-специалист. У меня за плечами многолетний опыт работы в области компьютерного программирования, устранения неисправностей и ремонта оборудования. Я специализируюсь на веб-разработке и дизайне баз данных. У меня также есть сертификат CCNA для проектирования сетей и устранения неполадок.