Мне кажется у меня путаница из-за постановки изначальной задачи. Зачем 13 ловить как ValueError, если можно просто IF-ом. Так ведь?
Механизм исключений часто используют в функциях что бы не создавать побочных эффектов. Например, пишешь калькулятор и при обработке деления проверяешь на ноль. И если это простой консольный калькулятор ты можешь просто вывести принтом "на ноль делить нельзя" и проблема закрыта. Но если ты будешь усложнять приложение, добавить GUI, например, тогда нужно разделить логику и отображения, разбить на функции, модули... И тогда вычисления попадают в функцию вроде def calc(a:float, b:float) -> float
Теперь у функции одна задача мы ждём от нее число за вывод сообщений отвечает другие части программы. И тут как раз подходит выброс исключения, которое обработается в нужном месте.