Поддерживает ли 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

2022-11-13T18:01:00+00:00