Для меня практическое правило заключается в том, что выражения assert используются для поиска внутренних ошибок и исключений для внешних ошибок. Отсюда вы можете извлечь большую пользу из следующего обсуждения Грега .
Выражения утверждения используются для поиска ошибок программирования: либо ошибок в самой логике программы, либо ошибок в ее соответствующей реализации. Условие assert проверяет, что программа остается в определенном состоянии. «Определенное состояние» - это, по сути, такое состояние, которое согласуется с предположениями программы. Обратите внимание, что «определенное состояние» для программы не обязательно должно быть «идеальным состоянием», или даже «обычным состоянием», или даже «полезным состоянием», но подробнее об этом важном пункте позже.
Чтобы понять, как утверждения вписываются в программу, рассмотрим процедуру в программе C ++, которая собирается разыменовать указатель. Теперь должна ли процедура проверить, является ли указатель NULL перед разыменованием, или она должна утверждать, что указатель не является NULL, а затем продолжить и разыменовать его независимо?
Я предполагаю, что большинство разработчиков захотят сделать и то, и другое: добавить утверждение, но также проверить указатель на значение NULL, чтобы не сбой в случае сбоя заявленного условия. На первый взгляд, выполнение теста и проверки может показаться самым разумным решением.
В отличие от заявленных условий, обработка ошибок программы (исключения) относится не к ошибкам в программе, а к входным данным, которые программа получает из своей среды. Часто это «ошибки» с чьей-либо стороны, например, попытка пользователя войти в учетную запись без ввода пароля. И хотя ошибка может помешать успешному завершению задачи программы, сбоя программы нет. Программа не может выполнить вход пользователя без пароля из-за внешней ошибки - ошибки со стороны пользователя. Если обстоятельства были другими, и пользователь ввел правильный пароль, и программа не смогла его распознать; тогда, хотя результат останется прежним, ошибка теперь будет принадлежать программе.
Обработка ошибок (исключений) преследует две цели. Первый - сообщить пользователю (или другому клиенту), что была обнаружена ошибка во вводе программы и что это означает. Вторая цель - восстановить приложение после обнаружения ошибки до четко определенного состояния. Обратите внимание, что сама программа в этой ситуации не ошибается. Конечно, программа может находиться в неидеальном состоянии или даже в состоянии, в котором не может быть ничего полезного, но ошибки программирования отсутствуют. Напротив, поскольку состояние восстановления после ошибки является одним из ожидаемых при разработке программы, оно может обрабатываться программой.