> On Nov 28, 2017, at 11:27, William Schilp <william.sch...@ansys.com> wrote: > > i'm using JCC in a rather large project where a C++ interface drives a java > application through the JCC interface. the java application makes > considerable use of exceptions (as it should) and the C++ interface needs > to catch the various exceptions and perform various actions based on the > exception thrown. unfortunately i have to use visual studio to compile the > C++ interface as well as the JCC interface. with vs2012 i was getting > random problems when trying to extract information from an exception thrown > by the java application as ExceptionOccurred() would randomly return NULL.. > with vs2015, ExceptionOccurred() always returns NULL. the basic flow was > this: > > // setup the JNI interface, which returns a pointer to the JNIenv > JNIEnv* jniEnv = setupJNIenv(); > > _jthrowable* jException = NULL; > try > { > <call something via JCC which fails throwing an exception in the java > code>; > } > catch(_EXC_JAVA jErr); > { > _jthrowable* jException = jniEnv->ExceptionOccurred(); <--- in vs2012 > this randomly returns NULL for exceptions that are caught > } > if(jException != NULL) > { > <do something for exception> > > as noted, ExceptionOccurred() would randomly return NULL when built with > vs2012, this was annoying but only happened on windows 10 machines. we've > moved to vs2015, and now ExceptionOccurred() always returns NULL. in > debugging this issue i put a break in JCCEnv::reportException(): > > void JCCEnv::reportException() const > { > JNIEnv *vm_env = get_vm_env(); > jthrowable throwable = vm_env->ExceptionOccurred(); <---- throwable is > not NULL here... > > if (throwable) > { > if (!env->handlers) > vm_env->ExceptionDescribe(); > > // python code removed > } > throw _EXC_JAVA; > } > > when i break at vm_env->ExceptionOccurred() it returns a non-NULL > throwable. then when i break in my catch block: catch(_EXC_JAVA)... > and look at the return value for ExceptionOccurred() it returns NULL. for > whatever reason, between the break in reportException() at > ExceptionOccurred() and my catch block, whatever is supposed to store the > jthrowable pointer gets set to NULL. > so i made a change to the throw _EXC_JAVA to throw a copy of the jthrowable > as such: > > throw jthrowable; > > and then catch the jthrowable in my interface. this appears to work as the > jthrowable is now non-NULL and i'm able to extract the actual contents of > the exception. > > my questions: > > 1. Why does JCCEnv::reportException() throw an int instead of the > jthrowable?
Because throwing object exceptions across DLL boundaries is fraught. Using int is recommended. > 2. do you have any idea why the return of JCCEnv::ExceptionOccurred() would > return non-NULL in reportException() and then in a later catch block return > NULL? If I remember correctly, the exception support requires JCC to be built in shared mode. Did you build it this way ? Andi..