Хороший вопрос.
1. В catch только одно проверяем конкретное исключение, которое мы ждём и знаем как обработать.
Например, при вставке записи в БД мы можем
обработать ошибку уникального ключа, сообщив пользователю, что такой юзернейм уже занят.
Но если ошибка не такая, какую мы ожидали, то она должна быть обработана стандартным способом. Для этого её надо перевыборосить.
2. Если в принципе надо сначала что-то сделать в случае ошибки.
Например, как в предыдущем ответе, залогировать
Или - более распространенный случай -
откатить транзакцию.
После этого исключение надо перевыбросить, чтобы ошибка обработалась обычным способом
3. Довольно экзотический случай. Исключение содержит стек вызовов, в котором. помимо прочего, лежат все параметры функций. Иногда эти параметры могут быть довольно чувствительными к раскрытию - например, параметрами конструктора класса для соединения с БД являются параметры подключения к БД. Чтобы очистить стек вызовов, надо бросить новое исключение. Но перевыбрасывать существующее нельзя - недо бросить именно совсем новое исключение,
передав в него сообщение об ошибке из старого
Конкретный пример в вопросе - это скорее всего попытка реализовать п.3, только неудачная.