Подтвердить что ты не робот

Безопасность исключений в Qt

Wikipedia говорит, что "кусок кода считается безопасным для исключений, временные сбои в коде не вызовут вредных эффектов, таких как утечка памяти, искаженные данные или неверный вывод. Исключительный код должен удовлетворять инвариантам, помещенным в код, даже если есть исключения".

И нам кажется, что нам нужна обработка исключений для безопасности исключений. С другой стороны, обработка исключений не очень популярна в приложениях Qt, пока я вижу.

Каковы ваши лучшие практики в Qt для обеспечения безопасности исключений? Что вы используете вместо обработки исключений?

4b9b3361

Ответ 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
 }