2010-11-10 19 views
8

Sto affrontando strani problemi. Vale a dire, Qt in qualche modo disabilita la gestione delle eccezioni nel mio programma. Non riesco a rilevare alcuna eccezione e quando lancio un'applicazione anomala si blocca.La gestione delle eccezioni non funziona con Qt su Windows

Sto usando Qt 4.7.0 (32 bit) da Qt SDK v2010.05 su Windows 7 (64 bit), g ++ (GCC) 4.5.1 da MinGW, NetBeans 6.9.1. Ma ho anche provato questo con g ++ 3.4.5 (anche da MinGW) e Qt Creator 2.0.1 - lo stesso strano comportamento.

Per esempio (caso più semplice):

#include <Qt/QApplication.h> 
#include <iostream> 
#include <stdexcept> 
#include <cstdlib> 

using namespace std; 


int main(int argc, char* argv[]) { 
    QApplication app(argc, argv); 

    try { 
     cout << "Before exception" << endl; 
     throw runtime_error("Exception occured"); 
     cout << "After exception" << endl; 
    } catch (runtime_error& exc) { 
     cout << exc.what() << endl; 
     exit(1); 
    } 

    return 0; 
} 

Quando eseguo sopra programma ho questa uscita:

Prima eccezione

L'applicazione ha richiesto al runtime l'interruzione in un modo insolito.
Per ulteriori informazioni, contattare il team di supporto dell'applicazione.

Ho provato ad aggiungere flag "-fexceptions" a g ++ ma non ha cambiato nulla.

Quando non uso Qt, tutto è OK:

#include <Qt/QApplication.h> // It is not caused only by including Qt header 
          // so it doesn't matter if I comment this out or not 
#include <iostream> 
#include <stdexcept> 
#include <cstdlib> 

using namespace std; 


int main(int argc, char* argv[]) { 
    // QApplication app(argc, argv); 

    try { 
     cout << "Before exception" << endl; 
     throw runtime_error("Exception occured"); 
     cout << "After exception" << endl; 
    } catch (runtime_error& exc) { 
     cout << exc.what() << endl; 
     exit(1); 
    } 

    return 0; 
} 

L'output:

Prima eccezione
verificata un'eccezione durante

Qualcuno sa perché è questo capita in questo modo e come risolvere questo problema? Ha qualcosa a che fare con il tipo di metodo di gestione delle eccezioni (SJLJ o Dwarf-2) usato quando Qt è stato compilato?

+0

Wow, mi hai spaventato! Probabilmente stiamo per passare a Qt sulla mia raccomandazione e questo sarebbe stato un killer. Per fortuna funziona con VS. –

+0

Dove si blocca esattamente? Qualche possibilità di trovare una posizione più precisa? QApplication's notify() forse? – Bart

+4

probabilmente è configurato con il flag '-no-exceptions'. Prova a riconfigurare e ricreare l'SDK Qt. –

risposta

8

ho riconfigurato e ricompilato Qt con la bandierina -exceptions:
D:\Qt\2010.05\qt>mingw32-make confclean && configure -exceptions && mingw32-make
e ora tutto è ok!

Grazie a tutti per l'aiuto, in particolare a Nick D!

In ogni caso, è molto strano che avessi costruito Qt senza questa bandiera. Ho scaricato Qt SDK in formato binario dal sito ufficiale.

Problemi correlati