Оператор throw и создание своих типов исключений

Последнее обновление: 09.04.2023

Оператор throw

Оператор throw позволяет нам самим сгенерировать исключение в необходимом месте. Рассмотрим следующий код:

void main (){
     
	 try{
		Person tom = Person("Tom", -45);
		print(tom.age);
	}
	on Exception catch(e){
		 print(e);
	} 
}

class Person{
	String name;
	int age = 1;
	
	Person(this.name, age){
		if(age < 1 || age > 110) {
			throw Exception("Недопустимый возраст");
		}
		this.age = age;	// если возраст корректный, устанавливем его
	}
}

Например, при создании нового пользователя - объекта класса Person мы хотим предупредить ситуацию, когда в конструктор для возраста передается недопустимое (например, отрицательное значение). В этом случае мы можем с помощью оператора throw сгененировать исключение:

throw Exception("Недопустимый возраст");

В конструктор Exception передается сообщение, которое можно получить при обработке исключения.

Таким образом, при выполнении следующей строи в блоке try будет возникать исключение:

Person tom = Person("Tom", -45);

А в блоке on..catch можно обработать это исключение:

on Exception catch(e){
	print(e);
}

С помощью аргумента e в блоке catch мы можем получить сообщение об ошибке. Консольный вывод:

Exception: Недопустимый возраст

Создание своих исключений

Встроенная библиотека Dart обеспечивает большим количеством разных типов ошибок и исключений. Тем не менее для каких-то отдельных ситуаций, возможно, мы захотим создать свои собственные типы исключений. Например, в примере выше с возрастом пользователя мы можем все действия оформить в виде отдельного исключения. Например:

void main (){
     
	 try{
		Person tom = Person("Tom", -45);
		print(tom.age);
	}
	on AgeException catch(e){
		print(e);
		print(e.value);
	}
}

class Person{
	String name;
	int age = 1;
     
    Person(this.name, age){
		if(age < 1 || age > 110) {
			throw AgeException(age);	// генерируем исключение AgeException
		}
		this.age = age;
	}
}
class AgeException implements Exception{
    int value;
    AgeException(this.value);
    @override
    String toString() =>"Недопустимый возраст";
}

Консольный вывод программы:

Недопустимый возраст
-45

Здесь определен класс исключения AgeException, который реализует интерфейс типа Exception. (Фактически мы можем определить класс без реализации Exception). И в этом классе определен свое поле value, которое будет хранит некорректное значение возраста, которое вызвало исключение. Кроме того, переопределяем встроенный метод toString(), который возвращает строковое представление объекта, а в конкрентном случае - сообщение об ошибке.

При обработке исключения мы можем использовать этот метод для вывода сообщения об ошибке:

on AgeException catch(e){
	print(e);
	print(e.value);
}

В данном случае параметр e в catch представляет объект AgeException, у которого можно обратиться к полю value. А поскольку у класса AgeException переопределен метод toString(), то объект данного класса можно вывести на консоль (code>print(e)) - в этом случае фактически выводится сообщение об исключении.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850