В этом руководстве вы узнаете, как использовать оператор 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);
Как это работает.
- Во-первых, определите функцию
add()
, которая принимает два аргумента и возвращает их сумму. Функцияadd()
использует операторtypeof
для проверки типа каждого аргумента и выдает исключение, если тип не является числом. - Во-вторых, вызовите функцию
add()
и передайте ей строку и число. - В-третьих, покажите результат в консоль.
Скрипт вызывает ошибку, потому что первый аргумент( "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
.