Исключительная безопасность в Qt - PullRequest
17 голосов
/ 28 июня 2010

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

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

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

Ответы [ 4 ]

10 голосов
/ 28 июня 2010

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

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

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

7 голосов
/ 28 июня 2010

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

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

2 голосов
/ 28 июня 2010

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

1 голос
/ 28 июня 2010

Классы 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
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...