Да, лучшая практика - иметь много уловов, а не использовать общее исключение, такие инструменты, как fxcop, подтвердят это при анализе вашего кода. На практике я видел в основном 2-3 улова.
Вы можете заглянуть в свой проводник объектов, чтобы узнать, из какого класса происходит ваше исключение, и перехватить родительское исключение вместо всех 8 возможных исключений.
Практически, посмотрите, что может дать сбой в способе, которым вы в данный момент используете объект, очень часто может произойти только одно или два исключения, затем вы можете следовать за ним общим.
Перехват исключений не должен использоваться для управления потоком, он должен использоваться для обработки ситуации, когда ваш метод не имеет того, что ему нужно для успешной работы.
Внутри улова вы обычно пишете либо в файл журнала, либо в журнал событий системы. Вы бы написали что-то вроде
string message = "Ошибка при получении продукта из базы данных. Система сообщает: ex.Message"
или
string message = "Ошибка при получении продукта из базы данных"
if (ex.Number == 20)
{
message = message + "Вероятно, это означает, что не удалось установить соединение с базой данных"
}
message = message + ". Система сообщает: ex.Message"