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

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

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

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

17
задан metdos 28 June 2010 в 07:54
поделиться

4 ответа

C ++ имеет очень мощный механизм защиты от исключений. Деструкторы запускаются для всех переменных, которые выходят за рамки из-за исключения.Это отличается от таких языков, как Java, где для обеспечения безопасности исключений программист должен правильно выполнить предложения catch и finally .

Поведение C ++ при вызове деструкторов без проблем работает с объектами Qt в стеке. Все классы Qt имеют деструкторы, и ни один из них не требует ручной очистки. Более того, QSharedPointer может использоваться для управления объектами Qt, выделенными в куче; когда последний указатель выходит за пределы области видимости, объект уничтожается. Это включает случай, когда указатель выходит за пределы области видимости из-за исключения.

Итак, безопасность исключений определенно присутствует в Qt. Это просто прозрачно.

10
ответ дан 30 November 2019 в 13:45
поделиться

Qt (в основном) не является безопасным в плане исключений: http://doc.qt.io/archives/4.6/exceptionsafety.html

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

7
ответ дан 30 November 2019 в 13:45
поделиться

Классы 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
 }
1
ответ дан 30 November 2019 в 13:45
поделиться

Моя лучшая практика - не использовать (или, по крайней мере, избегать их в максимально возможной степени) исключения C ++ в коде на основе Qt, что делает их обработку несложной. Qt на самом деле не является причиной этого, я просто чувствую, что исключения часто делают вещи излишне сложнее, чем они должны быть. Но это помогает Qt сам по себе в основном избавляет от проблем с исключениями ... :)

2
ответ дан 30 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: