Урок 20 из 25
В прогрессе

19) Обработка ошибок

Конструкция try..catch..finally

				
					try {
  инструкции блока try
}
catch (error) {
  инструкции блока catch
}
finally {
  инструкции блока finally
}
				
			

После оператора try определяется блок кода. В этот блок помещаются инструкции, при выполнении которых может возникнуть потенциальная ошибка.

Затем идет оператор catch. После этого оператора в круглых скобках указывается название объекта, который будет содержать информацию об ошибке. И далее идет блок catch. Этот блок выполняется только при возникновении ошибки в блоке try.

После блока catch идет оператор finally со своим блоком инструкций. Этот блок выполняется в конце после блока try и catch вне зависимости, возникла ошибка или нет.

Стоит отметить, что только блок try является обязательным. А один из остальных блоков — catch или finally мы можем опустить. Однако один из этих блоков (не важно catch или finally) обязательно должен присуствовать. То есть мы можем использовать следующие варианты этой конструкции:

  • try…catch

  • try…finally

  • try…catch…finally

Генерация ошибок и оператор throw

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


Как работает throw

  • С помощью throw можно выбрасывать:
    • Объекты встроенного класса Error.
    • Пользовательские ошибки (например, строки, числа или объекты).
  • После вызова throw выполнение кода немедленно прекращается, и управление передается ближайшему блоку catch (если он есть).
				
					function divide(a, b) {
  if (b === 0) {
    // Генерация ошибки
    throw new Error("Деление на ноль невозможно");
  }
  return a / b;
}

try {
  console.log(divide(10, 0)); // Ошибка
} catch (error) {
  console.error("Ошибка:", error.message); // "Ошибка: Деление на ноль невозможно"
}

				
			

Примеры использования throw

				
					//Ошибка HTTP-запроса
function fetchData(url) {
  if (!url) {
    throw { code: 400, message: "URL не указан", hint: "Укажите URL для запроса" };
  }
  // Симуляция ошибки
  throw { code: 404, message: "Ресурс не найден" };
}

try {
  fetchData(""); // Пробуем вызвать без URL
} catch (error) {
  console.error(`Ошибка ${error.code}: ${error.message}`);
  console.info(`Подсказка: ${error.hint}`);
}

				
			
				
					//Ошибка аутентификации
function authenticateUser(user) {
  if (!user) {
    throw { code: 401, message: "Пользователь не найден" };
  }
  if (!user.isActive) {
    throw { code: 403, message: "Доступ запрещен. Активируйте учетную запись." };
  }
  return "Успешная аутентификация";
}

try {
  authenticateUser({ isActive: false });
} catch (error) {
  console.error(`Ошибка ${error.code}: ${error.message}`);
}

				
			

Класс Error и его свойства

Класс Error используется для создания ошибок. Его основные свойства:

  • name: Имя ошибки (по умолчанию "Error").
  • message: Сообщение об ошибке.
  • stack: Стек вызовов (полезно для отладки).
				
					try {
  throw new Error("Это пример ошибки");
} catch (error) {
  console.log("Имя ошибки:", error.name); // "Error"
  console.log("Сообщение ошибки:", error.message); // "Это пример ошибки"
  console.log("Стек вызовов:", error.stack); // Стек вызовов
}