Иван Кузьмицкий писал(а):
Обработка исключений придумана для того, чтобы подавить аварийную ситуацию и, по возможности, вернуть вычисление в рабочее русло. А вот если проблема вылезет в секции finally, то уже никакие примочки не помогут. Так что лучше придавать себе уверенности жёсткими проверками пред- и постусловий, нежели обёртывать всё и вся в try...except. Лучше, если ошибка проявит себя как можно раньше, а не будет задавлена обработчиком исключения.
Для того и существует секция finally, чтобы сделать финальные действия, которые нужно сделать в любом случае. Естественно, никакие обрадотки тут не ведуться, практически – закрытие файлов, освобождение памяти и тому подобное.
А вы, зачем-то притащили сюда в try...except. Я об этой паре ни слова не сказал.
И скажу честно, у меня в моих программах нет ни одной секции except. Вообще.
А вот try... finally – много.
И именно потому, что проверки я прописываю, но вот всех ситуаций не предусмотришь.
Особенно ситуации, которые возникают не в программе, а за её пределами, в операционке – может кто память пожрал или иные ресурсы кончились.
Иван Кузьмицкий писал(а):
Отработка подавления аварийной ситуации тоже может содержать ошибку, которая как раз вылезет в самый интересный момент
Может, если использовать не по назначению.
Евгений Темиргалеев писал(а):
А экскепшен может произойти в любой момент - типа той же нехватки памяти - в том месте, где вы финалли не предусмотрели. Или было лень написать. Или забыли про какой-то ресурс.
В КП память собирает сборщик мусора (100% гарантия сборки, программист ничего не пишет для этого); прочие ресурсы типа файлов закрываются в FINALIZE (программист реализует метод; вызовов не пишет; гарантия освобождения 100%).
Я вызвал процедуру.
В ней локальная переменная типа TQuery.
Мне нужно сделать запрос к базе и т.д.
В итоге, я обращаюсь к внешнему ресурсу – к операционной системе, для получения ресурса.
Получил, тут бац и что-то меня выбросило.
В секции finally я спокойно освободил внешние ресурсы и вышел из процедуры.
Кстати, проверить, вышел я аварийно или нет тоже не вопрос, если это важно для вызывающего процесса.