Задачи на исключения в Dart. Часть 2
Сделайте иерархию исключений для API: базовый класс ApiException и наследники NotFoundException, UnauthorizedException.
Используйте несколько блоков on в одном try-catch для разных типов исключений.
Используйте catchError для обработки ошибок Future.
Используйте rethrow после логирования ошибки в catch.
Сделайте функцию safeDivide с обработкой деления на ноль через ArgumentError или возврат null.
Обработайте несколько типов исключений в catch: FormatException, ArgumentError и общий Exception.
Используйте try/finally без catch для гарантированной очистки ресурса (например, закрытие «соединения» в finally).
Сделайте retry через try-catch в цикле: повторите операцию до 3 раз при ошибке.
Сделайте функцию validateAge с ArgumentError, если возраст меньше 0 или больше 150.
Сравните подход с исключениями и тип Result<T> (успех/ошибка без throw): реализуйте оба варианта функции деления и кратко опишите, когда удобнее исключения, а когда — явное Result.
// набросок Result:
// sealed class Result<T> {}
// class Ok<T> extends Result<T> { final T value; ... }
// class Err<T> extends Result<T> { final String message; ... }