В качестве общей практики я бы не предложил использовать обработку исключений в качестве элемента управления для функциональной логики. Поэтому я выступаю за проверку идентификатора -1 и создание человека в этом случае, а не после факта в спасательном блоке.
Если вы ищете причину, 2 я думаю о производительности и ясности.
Исключения стоят дорого, и вы не хотите нести за них стоимость обработки, если ее можно избежать.
Кроме того, исключения предназначены для обозначения состояния ошибки, а не ожидаемого пути в вашей логике. Используя их таким образом, вы загрязняете воду, и кажется, что это не значит, что он работает. Имея проверку для не существующего человека в фильтре before, становится более ясным, что это иногда должно происходить, и ясно, что это происходит до сохранения.
Кроме того, если вы применили эту логику при обработке исключения, вам придется повторить операцию, которая не удалась, делая вашу логику сохранения намного более сложной, либо зацикливаясь, либо рекурсивно, либо дублируя неудачное сохранение. Это также сделает ваш код менее понятным для следующего кодера, который должен над ним работать.