/// Base exception for all application errors. sealed class AppException implements Exception { const AppException({required this.message, this.cause}); final String message; final Object? cause; @override String toString() => 'AppException: $message'; } /// Network-related errors (connection, timeout, etc.) class NetworkException extends AppException { const NetworkException({required super.message, super.cause}); } /// API errors with HTTP status codes. class ApiException extends AppException { const ApiException({ required super.message, required this.statusCode, this.code, super.cause, }); final int statusCode; final String? code; bool get isUnauthorized => statusCode == 401; bool get isForbidden => statusCode == 403; bool get isNotFound => statusCode == 404; bool get isServerError => statusCode >= 500; } /// Authentication-related errors. class AuthException extends AppException { const AuthException({required super.message, super.cause}); } /// Cache/storage errors. class CacheException extends AppException { const CacheException({required super.message, super.cause}); } /// Validation errors. class ValidationException extends AppException { const ValidationException({ required super.message, this.fieldErrors = const {}, }); final Map fieldErrors; }