Comment trouver d’où une exception est émise avec Qt ?

Lorsqu’une exception est émise et non captée dans une application Qt, elle est captée par la boucle d’évenement de Qt, et le message suivant apparait dans la console:

Qt has caught an exception thrown from an event handler. Throwing exceptions from an event handler is not supported in Qt. You must reimplement QApplication::notify() and catch all exceptions there. terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc

Suivant la situation, std::bad_alloc est remplacé par le nom de l’exception. Le problème est que si vous voullez savoir où est le problème dans le code source, la pile d’appels pointe la boucle d’évennement de Qt, où l’exception est capté et émise, mais ce n’est pas l’endroit où l’erreur s’est produite.

J’ai eu le problème une première fois, il y a quelques jours lors de l’implémentation du support multi-calques dans EXR, mais comme l’exception était spécifique à OpenEXR, en effectuant une recherch dans le code, j’ai pu trouvé où l’erreur avait lieu. Mais ce n’est pas pratique, surtou quand l’erreur est générique comme avec std::bad_alloc qui peut être émise de n’import où. Et même de Qt lui-même dans ‘qBadAlloc()’. La solution suggèrer par Maelcum sur IRC est de tout simplement placer un point d’arrêt dans la fonction __cxa_throw, qui est une fonction de la librairie standard C++ qui est appellé pour faire le travail du mot clés throw (en tout cas, c’est le case pour la librairie standard stdlib++ de GNU, je ne sais as si c’est valide pour d’autres implémentations). Et ensuite vous obtenez une pile d’appels qui pointe l’erreur.

This entry was posted in KDE, Logiciel libre. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>