Оператор 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)) - в этом случае фактически выводится сообщение об исключении.