При отлове исключений всегда старайтесь использовать наиболее точное исключение, которое только можно.Например, при использовании SQL Server перехватите исключение SqlException, поскольку оно будет содержать гораздо больше информации об исключении, чем общее исключение.Вы можете получить фактические номера строк и другую полезную информацию для диагностики.
После того, как вы извлечете и зарегистрируете все, что релевантно, сбросьте исключение или поместите его в менее конкретное исключение, такое как InvalidDataException или Exception, и выбросьте его.Затем вы можете перехватить эти более общие исключения на более высоких уровнях.
try
{
// Execute DB call here
}
catch(SqlException exp)
{
// Log what you need from here.
throw new InvalidOperationException("Data could not be read", exp);
}
Когда вы вызываете этот метод с более высокого уровня, вы можете просто перехватить InvalidOperationException.Если для более высоких уровней требуется больше подробностей, InnerException предоставит SqlException, к которому можно получить доступ.
Общий подход к обработке исключений, который я придерживаюсь, заключается в том, чтобы поймать только то, на что я могу с пользой действовать.Нет смысла отлавливать действительно общие исключения на более низких уровнях кода, поскольку вы действительно можете ожидать, что все пойдет не так или сможет восстановиться после каждого исключения, например OutOfMemoryException или StackOverflowException.