Хорошо, я должен добавить в ответ на замечания, которые вы сделали в отдельном ответном сообщении:
(Было бы гораздо удобнее, если бы вы отредактировали это в исходном вопросе, чтобы он не оказался внизу ниже ответов на него.
Если вся очистка всегда выполняется в
деструкторы тогда не понадобятся
быть любым кодом очистки в улове
блок - все же C ++ имеет блоки catch, где
действия по очистке сделаны. Действительно это
есть блок для ловли (...), где он
возможно выполнение только действий по очистке
(ну, конечно, не может получить в любом
информация об исключении, чтобы сделать любое
каротаж).
catch имеет совершенно отдельную цель, и как программист на Java вы должны знать об этом. Предложение finally предназначено для «безусловных» действий по очистке. Независимо от того, как выходит блок, это должно быть сделано. Поймать для условной очистки. Если выдается исключение такого типа, нам нужно выполнить несколько дополнительных действий.
Очистка в блоке finally будет
сделано, был ли
исключение выброшено или нет - что
что всегда хочется, чтобы
код очистки существует.
В самом деле? Если мы хотим, чтобы всегда происходило для этого типа (скажем, мы всегда хотим закрыть соединение с базой данных, когда закончим с этим), то почему бы нам не определить его один раз ? В самом типе? Сделайте соединение с базой данных закрытым, вместо того, чтобы делать попытку / наконец-то вокруг каждого его использования?
Это дело деструкторов. Они гарантируют, что каждый тип может позаботиться о своей собственной очистке, каждый раз, когда он используется, без необходимости думать об этом вызывающему.
Разработчики C ++ с самого первого дня
страдает от необходимости повторять очистку
действия, которые появляются в блоках catch в
поток кода, который происходит при
успешный выход из блока try.
Java и C # программисты просто делают это
один раз в блоке finally.
Нет. Программисты C ++ никогда не страдали от этого. С программистами есть. И программисты на С, которые поняли, что у С ++ есть классы, а затем назвали себя программистами на С ++.
Я программирую на C ++ и C # ежедневно, и я чувствую, что меня мучает нелепая настойчивость C #, что я должен предоставить предложение finally (или блок using
) КАЖДЫЙ ОДИН РАЗ ВРЕМЯ Я использую подключение к базе данных или что-то еще, что должно быть убранным.
C ++ позволяет мне указать раз и навсегда, что «всякий раз, когда мы закончим с этим типом, он должен выполнять эти действия». Я не рискну забыть освободить память. Я не рискую забывать закрывать дескрипторы файлов, сокеты или соединения с базой данных. Потому что моя память, мои дескрипторы, сокеты и соединения дб делают это сами.
Как может когда-либо быть предпочтительным, чтобы при каждом типе писать двойной код очистки? Если вам нужно обернуть тип, потому что у него нет самого деструктора, у вас есть два простых варианта:
- Найдите подходящую библиотеку C ++, которая предоставляет этот деструктор (подсказка: Boost)
- Используйте boost :: shared_ptr, чтобы обернуть его, и снабдите его пользовательским функтором во время выполнения, указав, какую очистку нужно выполнить.
Когда вы пишете сервер приложений
программное обеспечение, такое как серверы приложений Java EE
Glassfish, JBoss и т. Д., Вы хотите быть
возможность ловить и регистрировать исключения
информация - в противоположность этому
упасть на пол. Или хуже попасть в
время выполнения и вызывает изящное
внезапный выход из сервера приложений.
Вот почему очень желательно иметь
всеобъемлющий базовый класс для любого
возможное исключение.
И в C ++ есть именно такой класс. станд :: исключение.
Занимался С ++ со времен CFront
и Java / C # большую часть этого десятилетия. Является
ясно, что есть просто огромный
культурный разрыв в том, как принципиально
к подобным вещам приближаются.
Нет, вы никогда не делали C ++. Вы сделали CFront или C с классами. Не C ++. Там огромная разница. Перестаньте называть ответы хромыми, и вы можете узнать что-то о языке, который, как вы думали, вы знали ;)