i sort of agree with you. throwing an object through a DLL boundary may be problematic due to memory allocation/deallocation. but in this case, it's throwing a pointer (_jthrowable*), which is pretty much the same as throwing an int...
On Tue, Nov 28, 2017 at 12:42 PM, Andi Vajda <va...@apache.org> wrote: > > > 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.. > > >