_>Это как раз максимально удобно, потому что тут тебе IDE сама покажет место, куда необходимо вставить обработчик ошибок. Ведь для ошибок (а не критических ситуаций, которые обрабатываются паниками) как раз характерна обработка по месту, а не один глобальный обработчик на всё приложение.
Вообще-то, в большинстве случаев ошибки обработать можно не "по месту" (где функция вызвана), а где-то десятком уровней выше по стеку. Для этого и нужны исключения, чтобы иметь возможность обработать ошибку не там, где она возникла, а там, где имеется достаточно информации для ее обработки.
Как правило, непосредственный caller не имеет эту информацию, поэтому тоже вынужден вернуть ошибку, и далее по курсу (см. "bubble wrapping", видимо, мне пора уже начать публиковать все внутренние статьи, что я писал за годы, и объяснял, что bubble wrapping в итоге почти всегда превращается в самодельные exceptions).