Исключения должны валить программу, потому что это либо ошибка со стороны рантайма(StackOverflow, OutOfMemory) либо ошибка программиста, когда он не обработал кейс, который обязан был (OutOfRange). И в обоих случаях программа не валидна и её надо убивать.
Для иных ситуаций у языка обязаны быть другие способы обработки ошибок. В идеале - которые насильно навязывают вызывающему коду обработку этих самых ошибок(Result<T> в расте, Maybe в хаскеле)
ты путаешь паники и исключения