4 votes

GWT: Attraper une exception JSNI native dans le code Java

J'ai de la logique dans une méthode native, qui renvoie quelque chose ou null - ils sont tous les deux des états valides et significatifs, et je veux jeter une exception en cas d'échec de la méthode. Comme il s'agit de JSNI natif, je ne suis pas sûr de comment faire cela.

Donc considérez la méthode:

public final native  T myNativeMethod() /*-{

    //..du code

    //en javascript vous pouvez jeter n'importe quoi, pas seulement l'objet exception:
    throw "quelque chose"; 

}-*/;

mais comment attraper l'objet jeté?

void test() {
    try {
        myNativeMethod();
    }
    catch(Throwable e) { // quoi attraper ici???
    }
}

Y a-t-il un type d'exception Gwt spécial qui enveloppe les "objets d'exception" jetés depuis JSNI?

6voto

Daniel Kurka Points 6939

De la documentation de GWT :

Une exception peut être levée pendant l'exécution d'un code Java normal ou du code JavaScript à l'intérieur d'une méthode JSNI. Lorsqu'une exception est générée à l'intérieur d'une méthode JSNI et remonte dans la pile d'appels pour être attrapée par un bloc catch Java, l'exception JavaScript levée est encapsulée dans un objet JavaScriptException au moment où elle est attrapée. Cet objet d'enrobage contient uniquement le nom de la classe et la description de l'exception JavaScript qui s'est produite. La pratique recommandée est de traiter les exceptions JavaScript dans du code JavaScript et les exceptions Java dans du code Java.

Voici la référence complète : http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#exceptions

5voto

Tomasz Gawel Points 2554

Quant à la réponse de Daniel Kurka (et mon intuition ;)). Mon code pourrait alors ressembler à ceci :

public final native  T myNativeMethod() throws JavaScriptException /*-{

    //..quelques lignes de code

    //en javascript vous pouvez lancer n'importe quoi, ce n'est pas seulement un objet exception :
    throw "quelque chose"; 

    //ou à un autre endroit du code
    throw "autre chose";

    //ou :
    throw new (function WTF() {})();

}-*/;

void test() throws SomethingHappenedException, SomethingElseHappenedException, UnknownError {
    try {
        myNativeMethod();
    }
    catch(JavaScriptException e) { // quoi attraper ici ???

        final String name = e.getName(), description = e.toString(); 

        if(name.equalsIgnoreCase("chaine")) {

            if(description.equals("quelque chose")) {
                throw new SomethingHappenedException(); 
            }
            else if(description.equals("autre chose")) {
                throw new SomethingElseHappenedException(); 
            }
        }
        else if(name.equals("WTF")) {
            throw new UnknownError();
        }
    }
}

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