Dear John Zweizing, I've implemented your G__cpp_stopgap thing in cint5.14.22. In order to acivate the change , you need to define G__EXCEPTIONWRAPPER in platform dependency file or G__ci.h. Any thrown exception will be transformed into CINT error. #ifdef G__EXCEPTIONWRAPPER /********************************************************************* * G__ExceptionWrapper *********************************************************************/ extern "C" int G__ExceptionWrapper(G__WRAPPERMETHOD funcp ,G__value* result7 ,char* funcname ,struct G__param *libp ,int hash) { try { (*funcp)(result7,funcname,libp,hash); return 1; } catch(...) { G__genericerror("Error: C++ exception caught"); return 0; } } #endif /////////////////////////////// Thank you Masaharu Goto >I'd like to revisit a previous the root-talk thread on exception >handling. In that thread one root user pointed out that any exception >thrown by a compiled function will cause root to terminate. I have just >run into the same problem and I agree that this is an unusually annoying >feature. At the time of the previous thread, there were two responses, one >from Fons and the other from Masa as follows: > 1) Fons added some code to TSystem::Run() which attempted to catch > exceptions at that level and restart the application. This doesn't > work for compiled functions called by the interpreter. I believe that > the reason it doesn't work is that CINT is written/compiled in C, so > the exceptions can't propagate up the stack past CINT. > > 2) Masa stated that problems implicit in the C++ definition make it > impossible to catch exceptions from compiled functions in the > interpreter. > >I think that in fact what is needed is not the handling of the exceptions >per se, but rather some stop-gap to prevent root from terminating if an >exception is thrown by a compiled function being interpreted. I believe >that this is possible and that it can be implemented in one of two ways. > >The most trivial way would be to put an additional layer between cint and >the compiled function, as follows: > >Right now Cint call compiled C++ functions in > >int G__call_cppfunc(...) { > --- stuff snipped --- > (*cppfun)(...); > --- stuff snipped >} > >The additional C++ layer could be added as follows: > >int G__call_cppfunc(...) { > --- stuff snipped --- > if (G__cpp_stopgap(cppfun, ...)) { > ---- function failed... stop interpreting --- > } > --- stuff snipped >} > >where G__cpp_stopgap must be a C++ function like: > >extern "C" { >typedef int (cppwrap)(G__value*, char*, G__param*, int); > >int >G__cpp_stopgap(cppwrap* cppfunc, G__value* a, char* b, G__param* c, int d) { > try { > (*cppfunc)(a, b, c, d); > return 0; > } catch (...) { > return 1; > } >} >} > >A more elegant way of handling the exceptions would be to put the >try...catch code into the cint wrappers themselves based on the throw() >clause of the function definition. >
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:42 MET