Генерация ошибок throw
Интерпретатор JavaScript генерирует ошибки для ряда ситуаций, например, при вызове несуществующей функции, при повторном присвоении константе значения и т.д. Но при необходимости мы сами можем генерировать ошибки и определить условия, когда будет генерироваться ошибка.
Например, рассмотрим следующую ситуацию:
class Person{
constructor(name, age){
this.name = name;
this.age = age;
}
print(){ console.log(`Name: ${this.name} Age: ${this.age}`);}
}
const tom = new Person("Tom", -123);
// Name: Tom Age: -123
tom.print();
Класс Person
описывает человека. В конструкторе класс получает значения для свойств name (имя) и age
. Исходя из здравого смысла мы понимаем, что возраст не может быть отрицательным. Тем не менее пока, исходя из логики класса, ничего не мешает при создании объекта Person
передать ему для возраста отрицательное значение. С точки зрения интерпретатора JavaScript ошибки нет, однако с точки логики и здравого смысла - это ошибка. Как исправить эту ситуацию? Есть различные способы, и один из них заключается в генерации исключения.
Для генерации исключения применяется оператор throw
, после которого указывается информация об ошибке:
throw информация_об_ошибке;
Информация об ошибке может представлять любой объект. Сгенерируем исключение при передаче в конструктор Person
отрицательного значения для свойства age
:
class Person{
constructor(name, age){
if(age < 0) throw "Возраст должен быть положительным";
this.name = name;
this.age = age;
}
print(){ console.log(`Name: ${this.name} Age: ${this.age}`);}
}
// Uncaught Возраст должен быть положительным
const tom = new Person("Tom", -123);
tom.print();
В итоге при вызове конструктора Person
будет сгенерировано исключение и программа завершится ошибкой. А на консоли браузера мы увидим информацию об ошибке, которая указана после оператора throw
:
Uncaught Возраст должен быть положительным
Как и в общем случае мы можем обработать эту ошибку с помощью блока try...catch
:
class Person{
constructor(name, age){
if(age < 0) throw "Возраст должен быть положительным";
this.name = name;
this.age = age;
}
print(){ console.log(`Name: ${this.name} Age: ${this.age}`);}
}
try{
// Uncaught Возраст должен быть положительным
const tom = new Person("Tom", -123);
tom.print();
}
catch(error){
console.log("Произошла ошибка");
// Возраст должен быть положительным
console.log(error);
}
Оператор throw
может вызываться в различных контекстах, например, в том же блоке try
:
try{
throw "Непредвиденная ошибка!";
}
catch(error){
// Непредвиденная ошибка!
console.log(error);
}