From 42b7c34d1a1831b9c04bfd2c1ebe77ad274a0e71 Mon Sep 17 00:00:00 2001 From: Yuri Petrov <48598325+petrovyuri@users.noreply.github.com> Date: Thu, 23 Oct 2025 12:00:09 +0300 Subject: [PATCH] =?UTF-8?q?fix(di):=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D1=83=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=B5=D0=B2=20(#34)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(di): улучшить обработку ошибок при инициализации репозиториев * fix(di): улучшить обработку ошибок при инициализации репозиториев и сервисов --------- Co-authored-by: petrovyuri --- lib/di/di_repositories.dart | 153 ++++++++++++++++-------------------- lib/di/di_services.dart | 1 + lib/runner/app_runner.dart | 7 +- 3 files changed, 72 insertions(+), 89 deletions(-) diff --git a/lib/di/di_repositories.dart b/lib/di/di_repositories.dart index 0648a66..bed3e52 100644 --- a/lib/di/di_repositories.dart +++ b/lib/di/di_repositories.dart @@ -74,88 +74,57 @@ final class DiRepositories { required DiContainer diContainer, }) { onProgress('Начинаем инициализацию репозиториев...'); - try { - // Инициализация репозитория обновлений - updatesRepository = _lazyInitRepo( - mockFactory: UpdateMockRepository.new, - mainFactory: UpdateRepository.new, - onProgress: onProgress, - environment: diContainer.env, - ); - onProgress(updatesRepository.name); - } on Object catch (error, stackTrace) { - onError( - 'Ошибка инициализации репозитория IUpdateRepository', - error, - stackTrace, - ); - } - try { - // Инициализация репозитория авторизации - authRepository = _lazyInitRepo( - mockFactory: AuthMockRepository.new, - mainFactory: () => AuthRepository( - httpClient: diContainer.httpClientFactory( - diContainer.debugService, - diContainer.appConfig, - ), - ), - onProgress: onProgress, - environment: diContainer.env, - ); - onProgress(authRepository.name); - } on Object catch (error, stackTrace) { - onError( - 'Ошибка инициализации репозитория IAuthRepository', - error, - stackTrace, - ); - } + // Инициализация репозитория обновлений + updatesRepository = _lazyInitRepo( + mockFactory: UpdateMockRepository.new, + mainFactory: UpdateRepository.new, + onProgress: onProgress, + onError: onError, + environment: diContainer.env, + ); - try { - // Инициализация репозитория сервиса управления токеном доступа - mainRepository = _lazyInitRepo( - mockFactory: MainMockRepository.new, - mainFactory: () => MainRepository( - httpClient: diContainer.httpClientFactory( - diContainer.debugService, - diContainer.appConfig, - ), + // Инициализация репозитория авторизации + authRepository = _lazyInitRepo( + mockFactory: AuthMockRepository.new, + mainFactory: () => AuthRepository( + httpClient: diContainer.httpClientFactory( + diContainer.debugService, + diContainer.appConfig, ), - onProgress: onProgress, - environment: diContainer.env, - ); - onProgress(mainRepository.name); - } on Object catch (error, stackTrace) { - onError( - 'Ошибка инициализации репозитория IMainRepository', - error, - stackTrace, - ); - } + ), + onProgress: onProgress, + onError: onError, + environment: diContainer.env, + ); - try { - // Инициализация репозитория профиля - profileRepository = _lazyInitRepo( - mockFactory: ProfileMockRepository.new, - mainFactory: () => ProfileRepository( - httpClient: diContainer.httpClientFactory( - diContainer.debugService, - diContainer.appConfig, - ), + // Инициализация репозитория сервиса управления токеном доступа + mainRepository = _lazyInitRepo( + mockFactory: MainMockRepository.new, + mainFactory: () => MainRepository( + httpClient: diContainer.httpClientFactory( + diContainer.debugService, + diContainer.appConfig, ), - onProgress: onProgress, - environment: diContainer.env, - ); - onProgress(profileRepository.name); - } on Object catch (error, stackTrace) { - onError( - 'Ошибка инициализации репозитория IProfileRepository', - error, - stackTrace, - ); - } + ), + onProgress: onProgress, + onError: onError, + environment: diContainer.env, + ); + + // Инициализация репозитория профиля + profileRepository = _lazyInitRepo( + mockFactory: ProfileMockRepository.new, + mainFactory: () => ProfileRepository( + httpClient: diContainer.httpClientFactory( + diContainer.debugService, + diContainer.appConfig, + ), + ), + onProgress: onProgress, + onError: onError, + environment: diContainer.env, + ); onProgress( 'Инициализация репозиториев завершена! Было подменено репозиториев - ${_mockReposToSwitch.length} (${_mockReposToSwitch.join(', ')})', @@ -169,26 +138,36 @@ final class DiRepositories { /// - [mockFactory] - функция-фабрика для инициализации мокового репозитория /// - [mainFactory] - функция-фабрика для инициализации основного репозитория /// - [onProgress] - обратный вызов для уведомления о прогрессе + /// - [onError] - обратный вызов для обработки ошибок инициализации /// - [environment] - окружение приложения для определения стратегии инициализации /// /// Возвращает: /// - Экземпляр репозитория в зависимости от окружения + /// + /// Throws: + /// - Перебрасывает исключение, если инициализация репозитория завершилась с ошибкой T _lazyInitRepo({ required AppEnv environment, required T Function() mainFactory, required T Function() mockFactory, required OnProgress onProgress, + required OnError onError, }) { - // TODO(yura): https://github.com/smmarty/friflex_flutter_starter/issues/31 - добавить onError + try { + final repo = switch (environment) { + AppEnv.dev => mockFactory(), + AppEnv.prod => mainFactory(), + AppEnv.stage => + _mockReposToSwitch.contains(T) ? mockFactory() : mainFactory(), + }; - final repo = switch (environment) { - AppEnv.dev => mockFactory(), - AppEnv.prod => mainFactory(), - AppEnv.stage => - _mockReposToSwitch.contains(T) ? mockFactory() : mainFactory(), - }; - - onProgress(repo.name); - return repo; + // throw Exception('Тестовая - ошибка инициализации репозитория $T'); + onProgress(repo.name); + return repo; + } on Object catch (error, stackTrace) { + onError('Ошибка инициализации репозитория $T', error, stackTrace); + // Перебрасываем исключение дальше, чтобы не скрыть ошибку инициализации + rethrow; + } } } diff --git a/lib/di/di_services.dart b/lib/di/di_services.dart index 987661e..6cd93bf 100644 --- a/lib/di/di_services.dart +++ b/lib/di/di_services.dart @@ -41,6 +41,7 @@ final class DiServices { required DiContainer diContainer, }) { try { + // throw Exception('Тестовая - ошибка инициализации сервиса путей'); pathProvider = const AppPathProvider(); onProgress(AppPathProvider.name); } on Object catch (error, stackTrace) { diff --git a/lib/runner/app_runner.dart b/lib/runner/app_runner.dart index 2f6a84e..c481474 100644 --- a/lib/runner/app_runner.dart +++ b/lib/runner/app_runner.dart @@ -134,8 +134,11 @@ class AppRunner { ..logOnComplete(name) ..stop(); }, - onError: (message, error, [stackTrace]) => - debugService.logError(message, error: error, stackTrace: stackTrace), + onError: (message, error, [stackTrace]) { + timerRunner.stop(); + _debugService.logError(message, error: error, stackTrace: stackTrace); + throw Exception('Ошибка инициализации зависимостей: $message'); + }, ); //throw Exception('Test error'); return diContainer;