4 votes

Traitement des exceptions de la boucle d'événement Qt/C++

J'ai une application fortement basée sur QT et sur de nombreuses librairies tierces. Celles-ci lèvent des exceptions dans plusieurs cas.

Dans une application Qt native, cela entraîne l'abandon ou la fin de l'application. Souvent, le modèle de données principal reste intact, car je le conserve dans un Qt pur, sans données externes.

Je pense donc que je pourrais aussi simplement récupérer en disant à l'utilisateur qu'une erreur s'est produite dans tel ou tel processus et qu'il devrait sauvegarder maintenant ou même décider de continuer à travailler sur le modèle principal.

Actuellement, le programme se termine silencieusement sans même raconter une histoire.

6voto

Ralph Tandetzky Points 5310

Parfois, il est vraiment difficile d'attraper toutes les exceptions. Si une exception se glisse accidentellement à travers, ce qui suit aide beaucoup. Hériter de QApplication et remplacer le notify() de la manière suivante

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;
}

Remplacez ensuite le QApplication dans votre main() par votre classe personnalisée. Tout events y slots sont émis par cette fonction, de sorte que toutes les exceptions peuvent être capturées et que votre application devient stable.

5voto

Gareth Stockwell Points 2136

Comme indiqué dans la documentation de Qt aquí Qt n'est actuellement pas entièrement protégé contre les exceptions. La section "Récupération des exceptions" de cette page décrit la seule chose que vous pouvez faire dans une application Qt lorsqu'une exception est levée - nettoyer et quitter l'application.

Étant donné que vous utilisez des bibliothèques tierces qui lèvent des exceptions, vous devez les attraper à la frontière entre la bibliothèque externe et le code Qt, et les traiter là - comme indiqué dans le commentaire de Caleb. Si l'erreur doit être propagée dans l'application Qt, cela doit être fait soit en retournant un code d'erreur (si possible), soit en postant un événement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X