Сразу оговорюсь, речь о динамических языках. По моему в статически-типизированных исключения это вообще ненужная сущность, они должны заставить пользователя заранее обработать всё, где могут быть ошибки.
Ну и вообще исключения не самая лучшая идея наверное, но раз они есть в подавляющем большинстве мейнстримных языков - надо научится с ними жить (ну или без них).
Так вот, логика такая: приходят данные (хттп-запрос или вообще что угодно), и переданные параметры проходят через ряд валидирующих и обрабатывающих (или сразу и то и то) функций. И на каждом этапе мы можем обнаружить, что данные не правильные и дальше продолжать нет смысла. Так вот, нам сразу выходить из функции например с nil (или описанием ошибки например) или бросать эксепшн который ловить на самом верхнем уровне. По сути разницы особой нет, главное только чтобы везде одинаково было. Но таки что выбрать и почему?