Оператор throw в JavaScript

В этом руководстве вы узнаете, как использовать оператор throw JavaScript для создания исключения.

Вот синтаксис:

throw expression;

В этом синтаксисе expression указывает значение исключения. Как правило, вы будете использовать новый экземпляр класса Error или его подклассов.

При встрече с оператором throw механизм JavaScript прекращает выполнение и передает управление первому блоку catch в стеке вызовов. Если блок catch не существует, механизм JavaScript завершает выполнение скрипта.

Примеры исключений JavaScript

Давайте рассмотрим несколько примеров использования оператора throw.

1) Использование оператора throw для создания исключения

В данном примере оператор throw используется для создания исключения в функции:

function add(x, y) {
  if (typeof x !== 'number') {
    throw 'The first argument must be a number';
  }
  if (typeof y !== 'number') {
    throw 'The second argument must be a number';
  }

  return x + y;
}

const result = add('a', 10);
console.log(result);

Как это работает.

  1. Во-первых, определите функцию add(), которая принимает два аргумента и возвращает их сумму. Функция add() использует оператор typeof для проверки типа каждого аргумента и выдает исключение, если тип не является числом.
  2. Во-вторых, вызовите функцию add() и передайте ей строку и число.
  3. В-третьих, покажите результат в консоль.

Скрипт вызывает ошибку, потому что первый аргумент( "a" ) не является числом:

Uncaught The first argument must be a number

Чтобы обработать исключение, вы можете использовать оператор try...catch. Например:

function add(x, y) {
  if (typeof x !== 'number') {
    throw 'The first argument must be a number';
  }
  if (typeof y !== 'number') {
    throw 'The second argument must be a number';
  }

  return x + y;
}

try {
  const result = add('a', 10);
  console.log(result);
} catch (e) {
  console.log(e);
}

Выход:

The first argument must be a number

В этом примере мы помещаем вызов функции add() в блок try. Поскольку expression в операторе throw является строкой, исключение в блоке catch является строкой, как показано в выходных данных.

2) Использование throw для генерации экземпляра класса Error

В следующем примере мы исключаем экземпляр класса Error, а не строку в функцию add() ;

function add(x, y) {
  if (typeof x !== 'number') {
    throw new Error('The first argument must be a number');
  }
  if (typeof y !== 'number') {
    throw new Error('The second argument must be a number');
  }

  return x + y;
}

try {
  const result = add('a', 10);
  console.log(result);
} catch (e) {
  console.log(e.name, ':', e.message);
}

Выход:

Error : The first argument must be a number

Как показано в выводе, объект исключения в блоке catch имеет name Error и message, которое мы передаем конструктору Error().

3) Создание пользовательского исключения

Иногда вы хотите выдать пользовательскую ошибку, а не встроенную Error. Для этого вы можете определить собственный класс ошибок, который расширяет класс Error и создает новый экземпляр этого класса.

Пример:

Определите NumberError, который расширяет класс Error :

class NumberError extends Error {
  constructor(value) {
    super(`"${value}" is not a valid number`);
    this.name = 'InvalidNumber';
  }
}

constructor() класса NumberError принимает значение, которое вы передадите ему при создании нового экземпляра класса.

В constructor() класса NunberError мы вызываем конструктор класса Error через super и передаем ему строку. Кроме того, мы переопределяем имя ошибки на литеральную строку NumberError. Если мы этого не сделаем, name NumberError будет Error.

Затем используйте класс NumberError в функции add() :

function add(x, y) {
  if (typeof x !== 'number') {
    throw new NumberError(x);
  }
  if (typeof y !== 'number') {
    throw new NumberError(y);
  }

  return x + y;
}

В функции add() мы исключаем экземпляр класса NumberError, если аргумент не является допустимым числом.

В-третьих, перехватите исключение, вызванное функцией add() :

try {
  const result = add('a', 10);
  console.log(result);
} catch (e) {
  console.log(e.name, ':', e.message);
}

Выход:

NumberError : "a" is not a valid number

В этом примере имя исключения — NumberError, а сообщение — это то, что мы передаем в super() в constructor() класса NumberError.

Рейтинг
( Пока оценок нет )
Александр Русаков / автор статьи
Программист, разработчик, 12 лет опыта работы в крупных компаниях. Быстро освоил typescript, делюсь своими знаниями на страницах этого сайта.
Загрузка ...
JavaScript и TypeScript