2016-12-30 76 views
5

Podczas wywoływania metody Q_INVOKABLE zapisanej w C++ z funkcji JavaScript w QML, w jaki sposób można wygenerować wyjątek? Metoda jest własnością obiektu typu <MyApp>, zarejestrowane rozmowy qmlRegisterType()Qt: Zgłaszanie wyjątku od silnika C++ do QML

Na przykład, mam następujący kod QML:

TextField { 
    id: fld_recipient 

    onEditingFinished: { 
     try { 
      var identity=myapp.identities.current_Identity; 
      var company=identity.companies.current_Company; 
      myapp.lookup_email(identity.identity_id,company.company_id,fld_recipient.text) 
     } catch(e) { 
      console.log(e); 
     } 
    } 
} 

Tutaj metoda MojaApl :: lookup_email() idzie do serwer i szuka pasujących adresów e-mail. Ten proces może zostać zatrzymany przez dużą ilość błędów i chcę, aby instrukcja catch() pokazywała ten błąd.

Jak to zrobić po stronie C++? Rodzaj podobny do tego:

void MyApp::lookup_email(int identity_id,int company_id,QString email) { 

    .... 

    error_code=server->lookup_email(identity_id,company_id,email); 

    if (error_code) { /// throw an exception to QML engine, 
     ????? <= what goes here ? 
    } 
} 
+0

Po prostu zwróć pusty ciąg znaków, jeśli wystąpi błąd, a w QML sprawdź, czy ciąg rzeczywiście zawiera wiadomość e-mail. – dtech

+0

Również ten http://lists.qt-project.org/pipermail/interest/2015-April/016652.html – dtech

+0

@ddriver, dzięki! – Nulik

Odpowiedz

2

Qml nie powinien zawierać żadnej logiki biznesowej, ale wyświetlać tylko wyniki. W przypadku, gdy aplikacja działa w stanie wyjątku, należy uwzględnić wyjątek w logice biznesowej i przedstawić użytkownikowi wynikowy/nowy stan.

Jeśli założysz, że Twój kod (UI) zostanie wywołany z niekompletnymi danymi, powinieneś go zignorować. Lub użyj asercji na poziomie debugowania.