Какие знаешь типы ошибок в JavaScript

Ответ

В JavaScript ошибки делятся на несколько типов:

  1. SyntaxError - ошибка синтаксиса:
const a = ; // Uncaught SyntaxError: Unexpected token ';'
  1. ReferenceError - обращение к несуществующей переменной:
console.log(b); // Uncaught ReferenceError: b is not defined
  1. TypeError - неверный тип данных или операции:
null.foo(); // Uncaught TypeError: Cannot read property 'foo' of null
  1. RangeError - выход за допустимый диапазон:
new Array(-1); // Uncaught RangeError: Invalid array length
  1. URIError - ошибка в URI-функциях:
decodeURI('%'); // Uncaught URIError: URI malformed
  1. EvalError (редко) - ошибка в eval().

  2. Custom Errors - пользовательские ошибки через class MyError extends Error.

Все ошибки наследуются от базового объекта Error. Можно обрабатывать через try/catch и создавать свои типы ошибок.

Ответ 18+ 🔞

А, ну вот, опять про эти ошибки, блядь! Сидишь ты такой, кодишь, и тут — пиздец, всё посыпалось. А всё потому, что не знаешь, какая сволочь тебя подстерегает. Давай разберём, как они тебя ебут, эти ошибки, по полочкам.

Первая, самая тупая — SyntaxError. Это когда ты пишешь какую-то хуйню, а движок просто не понимает, что от него хотят. Типа:

const a = ; // Uncaught SyntaxError: Unexpected token ';'

Вот смотри, ты объявляешь константу a, а чему она равна? Хуй знает! Точка с запятой висит, а значения нет. Движок смотрит на это и думает: «Мудак, блядь, что за токен неожиданный?». И всё, приехали.

Дальше идёт ReferenceError. Это когда ты такой умный, ссылаешься на какую-то переменную, а её, сука, не существует. Вообще. Нигде.

console.log(b); // Uncaught ReferenceError: b is not defined

«b is not defined», — говорит тебе движок. А ты сидишь и думаешь: «А где ж она, блядь? Я же её вроде объявлял...». А нет, не объявлял. Или объявлял, но в другой вселенной. Короче, пизда.

Потом — TypeError. О, это классика, ёпта! Ты пытаешься сделать что-то с чем-то, что этого делать не умеет. Например, вызвать метод у null.

null.foo(); // Uncaught TypeError: Cannot read property 'foo' of null

«Cannot read property 'foo' of null», — вежливо сообщает тебе движок. А по-русски это: «Ты че, еблан, с null'ом работать собрался? Он же нихуя не объект!». Вот и сидишь с разбитым корытом.

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

new Array(-1); // Uncaught RangeError: Invalid array length

«Invalid array length», — говорит тебе движок. «Какой, нахуй, массив с минус одним элементом? Ты в своём уме?». И правильно говорит, кстати.

Дальше — URIError. Эта ошибка вылезает, когда ты криво работаешь с URI-функциями, типа decodeURI или encodeURI.

decodeURI('%'); // Uncaught URIError: URI malformed

«URI malformed», — то есть «URI кривой, как рога». Потому что один процент — это не валидный URI, блядь. Нужно что-то типа %20. А ты — нет.

Есть ещё EvalError, но это такая редкость, что про неё можно и не говорить. Как единорог, блядь. Встретишь — считай, повезло.

И наконец, самое вкусное — Custom Errors, свои собственные ошибки. Ты можешь нахуярить своих монстров, которые наследуются от базового Error.

class MySuperError extends Error {
  constructor(message) {
    super(message);
    this.name = 'MySuperError';
  }
}

throw new MySuperError('Всё пропало, шеф!');

Все эти твари, блядь, наследуются от одного папаши — объекта Error. И их всех можно ловить в try/catch, как бабочек сачком. А можно и не ловить — тогда пользователь увидит их в консоли и подумает, что ты криворукий дегенерат. Выбор за тобой, ёпта.