J'ai un flux kotlin dans lequel une exception est levée à mi-chemin. Quoi que je fasse, l'exception n'est pas rattrapée.
Le flux est le suivant : Dans le modèle de vue, j'ai une valeur qui doit être relue à partir d'une base de données lors d'un changement de date. J'utilise pour cela une carte de commutation.
val branches:LiveData<List<SCBranch>> = currentDay.switchMap {
schooldataUseCases.getBranches(it)
.catch{
exception ->withContext(Dispatchers.Main) {
Timber.d("catching exception in switchmap")
uncaughtException.value = exception.message
}
}
.asLiveData
Le cas d'utilisation est le suivant :
override fun getBranches(day:Day): Flow<List<SCBranch>> =
schooldataRepository.getBranchesForSchoolPeriodFlow(schoolPeriodManager.getSchoolPeriodFor(day.startTime))
Le SchoolPeriodManager sélectionne une période scolaire pour la date demandée. S'il n'y a pas de période scolaire définie pour la date demandée, il lève une exception. Je veux attraper cette exception et informer les utilisateurs qu'ils ont sélectionné une date invalide par le biais d'une autre liveData 'uncaughtexception'.
Hélas, mon application se termine par une exception Fatal qui est en fait l'exception lancée par le schoolPeriodManager. Le bloc catch dans le switchmap n'attrape donc pas l'exception.
J'ai essayé d'ajouter un CoroutineExceptionHandler au flux comme ceci :
val branches:LiveData<List<SCBranch>> = currentDay.switchMap {
schooldataUseCases.getBranches(it)
.asLiveData( exceptionHandler)
}
L'exceptionHandler n'attrape pas non plus l'exception. L'application se termine toujours par la même exception fatale
Comment dois-je implémenter le bloc catch pour attraper l'exception soulevée ?