fix(di): улучшить обработку ошибок при инициализации репозиториев (#34)

* fix(di): улучшить обработку ошибок при инициализации репозиториев
* fix(di): улучшить обработку ошибок при инициализации репозиториев и сервисов

---------

Co-authored-by: petrovyuri <petrovyuri@example.com>
This commit is contained in:
Yuri Petrov
2025-10-23 12:00:09 +03:00
committed by GitHub
parent 5d93fb1713
commit 42b7c34d1a
3 changed files with 72 additions and 89 deletions

View File

@@ -74,24 +74,16 @@ final class DiRepositories {
required DiContainer diContainer, required DiContainer diContainer,
}) { }) {
onProgress('Начинаем инициализацию репозиториев...'); onProgress('Начинаем инициализацию репозиториев...');
try {
// Инициализация репозитория обновлений // Инициализация репозитория обновлений
updatesRepository = _lazyInitRepo<IUpdateRepository>( updatesRepository = _lazyInitRepo<IUpdateRepository>(
mockFactory: UpdateMockRepository.new, mockFactory: UpdateMockRepository.new,
mainFactory: UpdateRepository.new, mainFactory: UpdateRepository.new,
onProgress: onProgress, onProgress: onProgress,
onError: onError,
environment: diContainer.env, environment: diContainer.env,
); );
onProgress(updatesRepository.name);
} on Object catch (error, stackTrace) {
onError(
'Ошибка инициализации репозитория IUpdateRepository',
error,
stackTrace,
);
}
try {
// Инициализация репозитория авторизации // Инициализация репозитория авторизации
authRepository = _lazyInitRepo<IAuthRepository>( authRepository = _lazyInitRepo<IAuthRepository>(
mockFactory: AuthMockRepository.new, mockFactory: AuthMockRepository.new,
@@ -102,18 +94,10 @@ final class DiRepositories {
), ),
), ),
onProgress: onProgress, onProgress: onProgress,
onError: onError,
environment: diContainer.env, environment: diContainer.env,
); );
onProgress(authRepository.name);
} on Object catch (error, stackTrace) {
onError(
'Ошибка инициализации репозитория IAuthRepository',
error,
stackTrace,
);
}
try {
// Инициализация репозитория сервиса управления токеном доступа // Инициализация репозитория сервиса управления токеном доступа
mainRepository = _lazyInitRepo<IMainRepository>( mainRepository = _lazyInitRepo<IMainRepository>(
mockFactory: MainMockRepository.new, mockFactory: MainMockRepository.new,
@@ -124,18 +108,10 @@ final class DiRepositories {
), ),
), ),
onProgress: onProgress, onProgress: onProgress,
onError: onError,
environment: diContainer.env, environment: diContainer.env,
); );
onProgress(mainRepository.name);
} on Object catch (error, stackTrace) {
onError(
'Ошибка инициализации репозитория IMainRepository',
error,
stackTrace,
);
}
try {
// Инициализация репозитория профиля // Инициализация репозитория профиля
profileRepository = _lazyInitRepo<IProfileRepository>( profileRepository = _lazyInitRepo<IProfileRepository>(
mockFactory: ProfileMockRepository.new, mockFactory: ProfileMockRepository.new,
@@ -146,16 +122,9 @@ final class DiRepositories {
), ),
), ),
onProgress: onProgress, onProgress: onProgress,
onError: onError,
environment: diContainer.env, environment: diContainer.env,
); );
onProgress(profileRepository.name);
} on Object catch (error, stackTrace) {
onError(
'Ошибка инициализации репозитория IProfileRepository',
error,
stackTrace,
);
}
onProgress( onProgress(
'Инициализация репозиториев завершена! Было подменено репозиториев - ${_mockReposToSwitch.length} (${_mockReposToSwitch.join(', ')})', 'Инициализация репозиториев завершена! Было подменено репозиториев - ${_mockReposToSwitch.length} (${_mockReposToSwitch.join(', ')})',
@@ -169,18 +138,22 @@ final class DiRepositories {
/// - [mockFactory] - функция-фабрика для инициализации мокового репозитория /// - [mockFactory] - функция-фабрика для инициализации мокового репозитория
/// - [mainFactory] - функция-фабрика для инициализации основного репозитория /// - [mainFactory] - функция-фабрика для инициализации основного репозитория
/// - [onProgress] - обратный вызов для уведомления о прогрессе /// - [onProgress] - обратный вызов для уведомления о прогрессе
/// - [onError] - обратный вызов для обработки ошибок инициализации
/// - [environment] - окружение приложения для определения стратегии инициализации /// - [environment] - окружение приложения для определения стратегии инициализации
/// ///
/// Возвращает: /// Возвращает:
/// - Экземпляр репозитория в зависимости от окружения /// - Экземпляр репозитория в зависимости от окружения
///
/// Throws:
/// - Перебрасывает исключение, если инициализация репозитория завершилась с ошибкой
T _lazyInitRepo<T extends DiBaseRepo>({ T _lazyInitRepo<T extends DiBaseRepo>({
required AppEnv environment, required AppEnv environment,
required T Function() mainFactory, required T Function() mainFactory,
required T Function() mockFactory, required T Function() mockFactory,
required OnProgress onProgress, required OnProgress onProgress,
required OnError onError,
}) { }) {
// TODO(yura): https://github.com/smmarty/friflex_flutter_starter/issues/31 - добавить onError try {
final repo = switch (environment) { final repo = switch (environment) {
AppEnv.dev => mockFactory(), AppEnv.dev => mockFactory(),
AppEnv.prod => mainFactory(), AppEnv.prod => mainFactory(),
@@ -188,7 +161,13 @@ final class DiRepositories {
_mockReposToSwitch.contains(T) ? mockFactory() : mainFactory(), _mockReposToSwitch.contains(T) ? mockFactory() : mainFactory(),
}; };
// throw Exception('Тестовая - ошибка инициализации репозитория $T');
onProgress(repo.name); onProgress(repo.name);
return repo; return repo;
} on Object catch (error, stackTrace) {
onError('Ошибка инициализации репозитория $T', error, stackTrace);
// Перебрасываем исключение дальше, чтобы не скрыть ошибку инициализации
rethrow;
}
} }
} }

View File

@@ -41,6 +41,7 @@ final class DiServices {
required DiContainer diContainer, required DiContainer diContainer,
}) { }) {
try { try {
// throw Exception('Тестовая - ошибка инициализации сервиса путей');
pathProvider = const AppPathProvider(); pathProvider = const AppPathProvider();
onProgress(AppPathProvider.name); onProgress(AppPathProvider.name);
} on Object catch (error, stackTrace) { } on Object catch (error, stackTrace) {

View File

@@ -134,8 +134,11 @@ class AppRunner {
..logOnComplete(name) ..logOnComplete(name)
..stop(); ..stop();
}, },
onError: (message, error, [stackTrace]) => onError: (message, error, [stackTrace]) {
debugService.logError(message, error: error, stackTrace: stackTrace), timerRunner.stop();
_debugService.logError(message, error: error, stackTrace: stackTrace);
throw Exception('Ошибка инициализации зависимостей: $message');
},
); );
//throw Exception('Test error'); //throw Exception('Test error');
return diContainer; return diContainer;