Frage

Ich mag eine schöne, saubere Art und Weise haben, von dem folgenden Java-Code als JNI zum Ausdruck:

try {
    SomeMethod ();
}
catch (ExceptionType1 e) {
    SomeAction ();
}
catch (ExceptionType2 e) {
    SomeAction ();
}
catch (ExceptionType3 e) {
    SomeAction ();
}

Gibt es eine ordentlich JNI prasseln, dies zu tun? Derzeit habe ich diese:

java_class = (*env)->FindClass (env, EXCEPTION_CLASS_NAME);
if (java_class == NULL) {
    *error_type_ref = ERROR_TYPE_FATAL;
    *exception_code_ref = EU_StrSprintf ("Class not found: %s", EXCEPTION_CLASS_NAME);
    cleanup ();
}
if ((*env)->IsInstanceOf (env, exception, java_class)) {
    SomeAction ();
    cleanup ();
}

Und natürlich, erneut auftritt dies für jede Ausnahme so gehandhabt. Es muss ein besserer Weg sein. Irgendwelche Empfehlungen? Ich bin nicht daran interessiert, alle meine vorhandenen Code über JNA Portierung, so würde ich ein Muster wie die home-grown, so implementiert werden kann, sprechen.

War es hilfreich?

Lösung

auf meinem Kommentar auf C vs C ++ erweitern.

Ich würde so etwas wie dies in C ++ versuchen (nb: völlig ungetestet, und wahrscheinlich nicht kompiliert wie )

class JavaClass {

    private:
        jclass cls;
        JNIEnv *env;

    public:
        JavaClass(JNIEnv *env, const char *className) {
            this.env = env;
            cls = env->FindClass(className);
            // handle errors
        }

        ~JavaClass() {
            env->DeleteLocalRef(cls);
        }

        bool isInstanceOf(jobject obj) {
            return env->IsInstanceOf(obj, cls);
        }
};

Der Client-Code würde dann in etwa so aussehen:

JavaClass ext1(env, "ExceptionType1");
JavaClass ext2(env, "ExceptionType2");
JavaClass ext3(env, "ExceptionType3");

SomeMethod();

if (ex = env->ExceptionOccurred()) {
    if (ext1.isInstanceOf(ex)) {
        doSomething();
    } else if (ext2.isInstanceOf(ex)) {
        doSomething();
    } else if (ext3.isInstanceOf(ex)) {
        doSomething();
    }
}

(Beachten Sie, dass die Semantik dieser isInstanceOf() Funktion ist Bass-ackwards - in diesem Thema "class.instanceof(object)", statt "object instanceof class").

Andere Tipps

  

Es muss ein besserer Weg sein

Template-Muster, kann sein?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top