В этом руководстве вы узнаете, как использовать оператор 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.
