viewModelScope.launch(handler) {
Здесь вы запускаете сопрограмму с родительской работой. Исключение, которое избегает его, распространяется в родительское задание, поэтому в этот момент оно не характеризуется как «необработанное».
Обработчики исключений Coroutine не являются механизмом для вашей обычной обработки исключений, они являются лишь крайней мерой, чтобы иметь возможность наблюдать исключение, которое ваш код должен был обработать, но не из-за ошибки.
Для обработки ошибок на уровне бизнес-логики используйте естественный механизм try-catch
. Если у вас много повторяющейся логики для обработки ошибок, вы всегда можете написать inline fun(block: inline () -> Unit)
, который оборачивает блок в такой шаблонный try-catch.