Википедия говорит, что "Часть кода, как говорят, безопасна от исключения, если отказы во время выполнения в рамках кода не произведут вредные эффекты, такие как утечки памяти, искаженные хранившие данные или недопустимый вывод. Безопасный от исключения код должен удовлетворить инварианты, помещенные в код, даже если исключения происходят".
И кажется, что нам нужна обработка исключений для безопасности исключения. Ot другая рука, обработка исключений не очень популярна в спокойных приложениях, пока я вижу.
Каковы Ваши лучшие практики в QT для удовлетворения безопасности исключения? Что Вы используете вместо обработки исключений?
C ++ имеет очень мощный механизм защиты от исключений. Деструкторы запускаются для всех переменных, которые выходят за рамки из-за исключения.Это отличается от таких языков, как Java, где для обеспечения безопасности исключений программист должен правильно выполнить предложения catch
и finally
.
Поведение C ++ при вызове деструкторов без проблем работает с объектами Qt в стеке. Все классы Qt имеют деструкторы, и ни один из них не требует ручной очистки. Более того, QSharedPointer
может использоваться для управления объектами Qt, выделенными в куче; когда последний указатель выходит за пределы области видимости, объект уничтожается. Это включает случай, когда указатель выходит за пределы области видимости из-за исключения.
Итак, безопасность исключений определенно присутствует в Qt. Это просто прозрачно.
Qt (в основном) не является безопасным в плане исключений: http://doc.qt.io/archives/4.6/exceptionsafety.html
С другой стороны, правильно работать с исключениями в программировании, управляемом событиями, очень сложно, поэтому лучше всего избегать их при использовании Qt и передавать коды ошибок.
Классы Qt нейтральны к исключениям
, как указано в документации .
Вы должны придерживаться логических значений для обработки ошибок, как и сам Qt.
Отсутствие внутреннего использования исключений было сделано по причинам переносимости, потому что Qt должен поддерживать множество различных платформ (переносимость и исключения не очень хорошо сочетаются).
Опять же, из документации:
В настоящее время единственный поддерживаемый вариант использования для восстановления после исключений, возникших в Qt (например, из-за нехватки памяти), - это выйти из цикла событий и выполнить некоторую очистку перед выходом из приложения. Типичный вариант использования:
QApplication app(argc, argv);
...
try {
app.exec();
} catch (const std::bad_alloc &) {
// clean up here, e.g. save the session
// and close all config files.
return 0; // exit the application
}
Моя лучшая практика - не использовать (или, по крайней мере, избегать их в максимально возможной степени) исключения C ++ в коде на основе Qt, что делает их обработку несложной. Qt на самом деле не является причиной этого, я просто чувствую, что исключения часто делают вещи излишне сложнее, чем они должны быть. Но это помогает Qt сам по себе в основном избавляет от проблем с исключениями ... :)