Это спорная тема, поэтому я ожидаю, что некоторые не согласятся с тем, что я собираюсь сказать.
Исключения составляют исключительные обстоятельства, а именно следующие два класса проблем:
- Ошибка программы
- Внешние проблемы
В первом случае ваша программа перешла в состояние, в котором она не должна находиться. Поэтому вы бросаете исключение и перехватываете егона достаточно высоком уровне, где программа может изящно продолжаться.В общем, это должно быть достаточно высоко в вашей программе.Реальность такова, что если в середине операции возникает ошибка, вы мало что можете сделать для ее восстановления (в конце концов, если бы вы знали, что ошибка была, вы бы ее исправили!).Лучше всего войти в систему, сообщить пользователю и двигаться дальше, если это возможно.Завершите текущую операцию, диалог, что угодно, или даже всю программу.
В последнем случае вы имеете дело с капризной и изменчивой вселенной.Все может пойти не так, не по вашей вине.В этом случае вам следует стараться выявлять ошибки как можно ближе к источнику и устранять их как можно лучше.Если вы отправляете электронное письмо на ненадежный сервер, возникает исключение, возможно, имеет смысл попробовать еще раз (предупреждая пользователя).Если соединение с базой данных оборвется, вы можете попробовать еще раз, но может быть лучше отказаться и убить текущую операцию.Это зависит от того, насколько хорошо вы понимаете внешние проблемы, которые могут возникнуть, и что на самом деле можно с ними сделать.
Если у вас есть известные условия ошибок, такие как ошибки при вводе данных пользователем или другие источники данных (например, анализ XML)ошибка, пользователь выбрал неправильный выбор в форме и т. д.), вероятно, лучше не создавать исключение, а собирать и сообщать об ошибках более структурированным образом.В одном из моих проектов у меня есть класс репортера ошибок, который может собирать ошибки, не прерывая выполнение программы.Затем эти ошибки могут быть сообщены пользователю или зарегистрированы.