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

View File

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

View File

@@ -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;