Узнайте о распространенных типах собственных ошибок в JavaScript.

Мы видим ошибки везде, от консоли нашего браузера до терминала нашей машины, на которой запущен Node.js.

Этот пост посвящен описанию типов ошибок, с которыми мы можем столкнуться во время разработки JS.

Совет. Хорошие ошибки - это разница между быстрым и безболезненным процессом развития и медленным и адским. При написании повторно используемого кода убедитесь, что вы пишете четкие и понятные ошибки.

Вы также можете использовать такие инструменты, как Bit (Github) для совместного использования повторно используемых компонентов прямо из любой кодовой базы в общую коллекцию компонентов в bit.dev. Он отлично подходит для максимального повторного использования кода, ускорения разработки и создания более удобной и масштабируемой кодовой базы.

1. RangeError

Это выбрасывается, когда число выходит за пределы допустимого диапазона значений.

Например,

const l = console.log
const arr = [90,88]
arr.length=90**99

У нас есть массив из двух элементов. Затем мы пытаемся увеличить массив до 90**99 == 2.9512665430652753e+193 элементов.

Это число намного превышает допустимый размер массивов. Запуск его вызовет RangeError:

$ node errors
errors.js:4
arr.length=90**99
 ^
RangeError: Invalid array length

потому что число, до которого мы хотим увеличить массив arr, выходит за пределы диапазона, указанного JS.

2. ReferenceError

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

Например,

const l=console.log
const cat = "cat"
cat
dog

У нас есть переменная cat, инициализированная как «cat». Затем мы обратились к переменной cat и переменной dog. Переменная cat существует, а переменная dog - нет.

cat вернет cat, а dog выдаст ошибку, потому что имя dog не может быть найдено в записи среды.

$ node errors
errors.js:3
dog
^
ReferenceError: dog is not defined

Каждый раз, когда мы создаем или определяем переменную, имя переменной будет записано в запись среды. Эта запись среды похожа на хранилище "ключ-значение",

+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+

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

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

var cat
env record
+-----------------+
| Key | Value |
-------------------
| cat | undefined |
+-----------------+

Когда позже переменной присваивается значение, переменная ищется в записи env, и при обнаружении начальное неопределенное значение перезаписывается присвоенным значением.

var cat
cat = "cat"
env record
+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+

Таким образом, JS-движок выдает ошибку RefernceError, когда имя переменной не может быть найдено в записи env.

+-------------+
| Key | Value |
---------------
| cat | "cat" |
+-------------+
cat // "cat", yes, :) it's there
dog // :( what's this? can't find it

Примечание. Неопределенная переменная не вызовет ошибку ReferenceError, поскольку она существует в записи env только в том случае, если ее значение не было установлено.

3. SyntaxError

Это самая распространенная ошибка, с которой мы сталкиваемся. Эта ошибка возникает, когда мы вводим код, который может понять JS-движок.

Эта ошибка перехватывается движком JS во время синтаксического анализа. В движке JS есть разные этапы, через которые проходит наш код, прежде чем мы увидим эти результаты на терминале.

  • токенизация
  • разбор
  • устный перевод

токенизация разбивает исходный код на отдельные блоки. На этом этапе числа, ключевые слова, литералы, операторы сортируются и индивидуально помечаются.

Затем сгенерированный поток токенов будет передан на этап синтаксического анализа, который обрабатывается анализатором. Здесь из потока токенов генерируется AST. AST - это абстрактное представление структуры нашего кода.

Во время этих двух этапов, токенизации и синтаксического анализа, если синтаксис / исходный код нашего кода не соответствует синтаксическим правилам JS, этапы завершаются сбоем и генерируют SyntaxError. Например,

const l = console.log
let cat h = "cat"

Что с одиноким «h»? Буква «h» нарушает код.

$ node errors
errors.js:3
let cat h = "cat"
 ^
SyntaxError: Unexpected identifier

Видите ли, Node.js указывает на проблему. В нем говорится, что буква «h» была неожиданной. Присутствие ИТ нарушает объявление переменной cat.

Таким образом, мы можем сказать, что во время синтаксического анализа / компиляции возникает синтаксическая ошибка.

4. TypeError

TypeError используется для обозначения неудачной операции, когда ни один из других объектов NativeError не является подходящим индикатором причины сбоя.

Ошибка TypeError возникает, когда операция выполняется с неправильным типом данных. Возможно, ожидается логическое значение, но обнаружена проблема.

Например,

если мы попытаемся преобразовать число в верхний регистр следующим образом:

const num = 123
num.toUpperCase()

Это вызовет TypeError

$ node errors
errors.js:4
num.toUpperCase()
 ^
TypeError: num.toUpperCase is not a function

потому что функция toUpperCase ожидает строковый тип данных. Функция toUpperCase намеренно является универсальной; он не требует, чтобы это значение было объектом String. Следовательно, его можно передать другим видам объектов для использования в качестве метода.

Только строки преобразуются в верхний или нижний регистр, если мы вызываем функцию toUpperCase для типов данных Objects, Boolean, Symbol, null, undefined, мы получим TypeError, потому что это неправильный тип данных, с которым он работает.

5. URIError

Это указывает на то, что одна из глобальных функций обработки URI использовалась способом, несовместимым с ее определением.

URI (Uniform Resource Indicator) в JS имеет функции: decodeURI, decodeURIComponent и т. Д.

Если мы вызовем любой из них с неправильным параметром, мы получим ошибку URIError

decodeURI("%")
^
URIError: URI malformed

decodeURI, получает незакодированную версию URI. «%» - неправильный URI, поэтому возникла ошибка URIError.

Ошибка URIError возникает, когда возникает проблема с кодированием или декодированием URI.

6. EvalError

Это используется для выявления ошибок при использовании глобальной функции eval().

Согласно изданию EcmaSpec 2018:

Это исключение в настоящее время не используется в данной спецификации. Этот объект остается для совместимости с предыдущими редакциями данной спецификации.

7. InternalError

Эта ошибка возникает внутри JS-движка, особенно когда у него слишком много данных для обработки и размер стека превышает критический предел.

Это происходит, когда движок JS перегружен слишком большим количеством рекурсий, слишком большим количеством переключений и т. Д.

switch(num) {
 case 1:
 ...
 break
 case 2:
 ...
 break
 case 3:
 ...
 break
 case 4:
 ...
 break
 case 5:
 ...
 break
 case 6:
 ...
 break
 case 7:
 ...
 break
 ... up to 1000 cases
 }

Слишком много рекурсии, простой пример:

function foo() {
 foo()
}
foo()

Заключение

Как мы уже говорили, никто не стоит выше ошибок. Это постоянное явление, поскольку мы набираем коды. Чтобы справиться с этим, нам нужно знать типы собственных ошибок, которые мы можем выдать. Мы перечислили их в этом посте с несколькими примерами, чтобы показать, как они встречаются.

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

Если у вас есть какие-либо вопросы относительно этого или чего-либо, что я должен добавить, исправить или удалить, не стесняйтесь комментировать, писать мне по электронной почте или в прямом сообщении.

Спасибо !!!

Учить больше