class ApiException implements Exception { final String message; final int? statusCode; final Map? errors; ApiException(this.message, {this.statusCode, this.errors}); @override String toString() => 'ApiException($statusCode): $message'; } class UnauthorizedException extends ApiException { UnauthorizedException([String? message]) : super(message ?? 'Требуется авторизация', statusCode: 401); } class NotFoundException extends ApiException { NotFoundException([String? message]) : super(message ?? 'Ресурс не найден', statusCode: 404); } class ValidationException extends ApiException { ValidationException([String? message, Map? errors]) : super(message ?? 'Ошибка валидации', statusCode: 422, errors: errors); } class ServerException extends ApiException { ServerException([String? message]) : super(message ?? 'Внутренняя ошибка сервера', statusCode: 500); } class NetworkException extends ApiException { NetworkException([String? message]) : super(message ?? 'Ошибка сети', statusCode: null); } class TariffLimitException extends ApiException { TariffLimitException([String? message]) : super(message ?? 'Достигнут лимит тарифа', statusCode: 403); }