Обработка исключений цикла событий Qt / C ++ - PullRequest
4 голосов
/ 28 апреля 2010

У меня есть приложение, основанное на QT и многих сторонних библиотеках. Это может привести к исключениям в нескольких случаях.

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

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

В настоящее время программа просто тихо завершает работу, даже не рассказывая историю.

Ответы [ 2 ]

5 голосов
/ 25 мая 2012

Иногда действительно трудно поймать все исключения. Если одно исключение случайно проскальзывает, следующее очень помогает. Наследовать от QApplication и переопределять функцию notify() следующим образом

bool MyApplication::notify( 
QObject * receiver, 
QEvent *  event ) 
{
    try 
    {
        return QApplication::notify(receiver, event);
    }
    catch(...)
    {
        assert( !"Oops. Forgot to catch exception?" );

        // may be handle exception here ...
    }

    return false;
}

Затем замените QApplication в вашей функции main() на ваш собственный класс. Все events и slots выдаются через эту функцию, так что все исключения могут быть перехвачены и ваше приложение станет стабильным.

5 голосов
/ 29 апреля 2010

Как указано в документации Qt здесь , Qt в настоящее время не является полностью безопасным для исключений.Раздел «Восстановление из исключений» на этой странице описывает единственное, что вы можете сделать в приложении Qt при возникновении исключения - очистить и выйти из приложения.

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

...