Code simple pour gérer les exceptions JNI
-
08-07-2019 - |
Question
Je voudrais avoir une façon agréable et ordonnée d’exprimer le code Java suivant en JNI:
try {
SomeMethod ();
}
catch (ExceptionType1 e) {
SomeAction ();
}
catch (ExceptionType2 e) {
SomeAction ();
}
catch (ExceptionType3 e) {
SomeAction ();
}
Existe-t-il un modèle JNI bien rangé pour ce faire? À l'heure actuelle, j'ai ceci:
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 ();
}
Et, bien sûr, cela se reproduit pour chaque exception ainsi gérée. Il doit y avoir une meilleure façon. Des recommandations? Je ne suis pas intéressé par le portage de la totalité de mon code existant sur la JNA. Je souhaiterais donc un modèle qui puisse être implémenté en interne, pour ainsi dire.
La solution
Pour développer mon commentaire sur le C vs C ++.
Je voudrais essayer quelque chose comme ça en C ++ (nb: complètement non testé, et ne compile probablement pas tel quel! )
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);
}
};
Le code client ressemblerait alors à quelque chose comme:
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();
}
}
(Notez que la sémantique de cette fonction isInstanceOf ()
est bass-ackwards - dans celui-ci, il s'agit de " class.instanceof (objet)
", au lieu de " instance d'objet de la classe
").
Autres conseils
Il doit y avoir un meilleur moyen
Modèle de modèle, peut-être?