Поддерживает ли C++ блоки «finally»? (И что это за RAII, о котором я все время слышу?)
В C++ finally НЕ требуется raii из-за RAII.
RAII перекладывает cpp ответственность за безопасность raii исключений с пользователя finally объекта на разработчика (и raii исполнителя) объекта. Я бы c++ сказал, что это правильное c++ место, так как вам нужно cpp только один раз правильно c++ настроить безопасность исключений exception (в дизайне/реализации). Используя c++ finally, вам нужно обеспечить exception-handling правильную безопасность исключений finally каждый раз, когда вы используете exception-handling объект.
Также IMO код выглядит c++ аккуратнее (см. ниже).
Пример:
Объект custom-exceptions базы данных. Чтобы убедиться, что cpp соединение с БД используется, его cxx необходимо открыть и закрыть. Используя raii RAII, это можно сделать в exception-handling конструкторе/деструкторе.
C++ как RAII
void someFunc()
{
DB db("DBDesciptionString");
// Use the db object.
} // db goes out of scope and destructor closes the connection.
// This happens even in the presence of exceptions.
Использование exception-handling RAII упрощает правильное c++ использование объекта БД. Объект exception-handling БД будет корректно закрываться c++-faq с помощью деструктора, независимо c++-faq от того, как мы пытаемся exception злоупотреблять им.
Наконец нравится Java
void someFunc()
{
DB db = new DB("DBDesciptionString");
try
{
// Use the db object.
}
finally
{
// Can not rely on finaliser.
// So we must explicitly close the connection.
try
{
db.close();
}
catch(Throwable e)
{
/* Ignore */
// Make sure not to throw exception if one is already propagating.
}
}
}
При использовании cpp finally правильное использование custom-exceptions объекта делегируется пользователю c++ объекта. т. е. Пользователь объекта finally несет ответственность за exceptions правильное явное закрытие cxx соединения с БД. Теперь вы finally можете возразить, что это custom-exceptions можно сделать в финализаторе, но finally ресурсы могут иметь ограниченную c++ доступность или другие ограничения, и custom-exceptions поэтому вы, как правило, хотите custom-exceptions контролировать выпуск объекта, а c++ не полагаться на недетерминированное exceptions поведение сборщика мусора.
Также cxx это простой пример.
Когда c++-faq у вас есть несколько ресурсов, которые custom-exceptions необходимо освободить, код c++-faq может усложниться.
Более подробный c++-faq анализ можно найти здесь: http://accu.org/index.php/journals/236
c++
exception
raii
finally
c++-faq
Поддерживает ли C++ блоки «finally»? (И что это за RAII, о котором я все время слышу?)
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.