Безопасность исключений в Qt
Wikipedia говорит, что "кусок кода считается безопасным для исключений, временные сбои в коде не вызовут вредных эффектов, таких как утечка памяти, искаженные данные или неверный вывод. Исключительный код должен удовлетворять инвариантам, помещенным в код, даже если есть исключения".
И нам кажется, что нам нужна обработка исключений для безопасности исключений. С другой стороны, обработка исключений не очень популярна в приложениях Qt, пока я вижу.
Каковы ваши лучшие практики в Qt для обеспечения безопасности исключений? Что вы используете вместо обработки исключений?
Ответы
Ответ 1
С++ обладает очень мощным механизмом защиты от экскрементов. Деструкторы запускаются для всех переменных, выходящих за рамки из-за исключения. Это отличается от таких языков, как Java, где исключение-безопасность требует от программиста правильного выбора catch
и finally
.
С++ поведение вызывающих деструкторов работает без проблем с объектами Qt в стеке. Все классы Qt имеют деструкторы, и ни одна из них не требует ручной очистки. Кроме того, QSharedPointer<T>
можно использовать для управления выделенными кучей Qt-объектами; когда последний указатель выходит за пределы области, объект уничтожается. Это включает случай, когда указатель выходит из области видимости из-за исключения.
Таким образом, исключение-безопасность, безусловно, присутствует в Qt. Это просто прозрачно.
Ответ 2
Qt (в основном) не исключение: http://doc.qt.io/archives/4.6/exceptionsafety.html
С другой стороны, правильное использование исключений в программировании, управляемом событиями, очень тяжело, поэтому лучше
заключается в том, чтобы избежать их при использовании Qt и передавать коды ошибок.
Ответ 3
Моя лучшая практика заключается в том, чтобы не использовать (или, по крайней мере, избегать их как можно больше). Исключения С++ в коде на основе Qt, что делает обработку их проблемой без проблем. Qt на самом деле не причина этого, но я просто чувствую, что исключения часто делают вещи излишне сложными, чем они должны быть. Но это помогает самому Qt в основном избавиться от ошибок...:)
Ответ 4
Qt классы exception neutral
, как указано в документации.
Вы должны придерживаться логических значений для обработки условий ошибки, как и сам 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
}